- ベストアンサー
HashMapデータの並び替えについて
- ファイル名とファイルサイズの複数の組み合わせが入ったHashMap型のインスタンスをファイルサイズ降順に並び替えるコードにおいて、Eclipse上で警告が表示されます。
- 問題の原因は、ジェネリックスの型の安全性に関する警告です。
- 解決策として、Comparatorの型をパラメータ化することで警告を解消することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 パラメータは合わせるようにしましょう・・・。 Map<String, Long> filesMap = new HashMap<String, Long>(); List<Map.Entry<String, Long>> filesEntries = new ArrayList<Map.Entry<String,Long(filesMap.entrySet()); Collections.sort(filesEntries, new Comparator<Map.Entry<String, Long>>() { public int compare(Map.Entry<String, Long> o1, Map.Entry<String, Long> o2) { return ((Long) o2.getValue()).compareTo((Long) o1.getValue()); } });
その他の回答 (1)
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 エラーメッセージに書いてある通りに、パラメータ指定すればOKです。 >Collections.sort(filesEntries, new Comparator(){ Collections.sort(filesEntries, new Comparator<? super Map.Entry<String,Long>>(){ まぁ、そのまんまですな・・・。
補足
taka45121さま、ありがとうございます。 お教え(下記)のようにしましたら、警告ではなく次のエラーになりました。 〔コード〕 Map<String,Long> filesMap = new HashMap<String,Long>(); (ファイル名とファイルサイズをfilesMapに入れる) // filesMapをファイルサイズの降順に並べる List<Map.Entry<String,Long>> filesEntries = new ArrayList<Map.Entry<String,Long>>(filesMap.entrySet()); Collections.sort(filesEntries, new Comparator<? super Map.Entry<String,Long>>(){ public int compare(Object o1, Object o2){ Map.Entry e1 =(Map.Entry)o1; Map.Entry e2 =(Map.Entry)o2; return ((Long)e2.getValue()).compareTo((Long)e1.getValue()); } }); 〔エラー〕 (Collections.sort(filesEntries, new Comparator<? super Map.Entry<String,Long>>(){ 行) この行に複数マーカーがあります - 型 new Comparator(){} は Comparator<? super Map.Entry<String,Long>> を拡張または実装できません。スーパータイプはワイルドカードを指定できません - Comparator は raw 型です。総称型 Comparator<T> への参照は、パラメーター化する必要があります - 型の安全性: 型 new Comparator(){} の式は、未検査の型変換を使用してComparator<? super Map.Entry<String,Long>> に準拠するようにする必要があります - 型の安全性: 型 Collections の総称メソッド sort(List<T>, Comparator<? super T>) の未検査の呼び出し sort(List<Map.Entry<String,Long>>, new Comparator(){}) がありました 2012 Feb. 04.
お礼
taka451213さま、ありがとうございます。 このたびの例では、MapをsentySet()でListにした時の要素の型は「Map.Entry<String,Long>」である。 「new comparator()」には「new comparator<Map.Entry<String, Long>>()」と型を書くこと。 それに合わせて「int compare(o1,o2)」にも「int compare(Map.Entry<String, Long> o1,Map.Entry<String, Long> o2)」と型を書くこと。 ということがわかっていませんでした。 2012 Feb. 05.