2

このメソッドを使用して、ハッシュ関数を並べ替えました。プログラムをコンパイルすると、次のエラーが表示されます。

Note: Retriever.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

私のhashMap<String, Double>

private static Map sortByComparator(Map unsortMap) {

    List list = new LinkedList(unsortMap.entrySet());

    // sort list based on comparator
    Collections.sort(list, new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            return ((Comparable) ((Map.Entry) (o2)).getValue())
                    .compareTo(((Map.Entry) (o1)).getValue());
        }
    });

    // put sorted list into map again
    Map sortedMap = new LinkedHashMap();
    for (Iterator it = list.iterator(); it.hasNext();) {
        Map.Entry entry = (Map.Entry) it.next();
        sortedMap.put(entry.getKey(), entry.getValue());
    }
    return sortedMap;
}
4

2 に答える 2

2

Collections Framework の使用方法については、Oracle のドキュメントを参照することをお勧めします。生の型を使用することはできますが、そうすると、コードの品質と生産性を向上させるために Java 5 で導入された機能が失われます。

Collections Framework を初めて使用する場合は、http://docs.oracle.com/javase/tutorial/collections/intro/index.htmlをご覧ください。それがどのように機能するかを理解するための良い情報源です。

あなたがプログラムを「コンパイルした」と言っているように、Eclipse のような IDE を使用していないと思います。プロジェクトの作成には Eclipse を使用することをお勧めします。これらのコンパイラ エラー/警告に役立ちます。したがって、コーディング中にエラーや警告などのヒントが得られます。

http://www.eclipse.org/を見てください。

于 2012-09-15T01:14:58.197 に答える
2

ジェネリックを無視し、「生の」型を使用しているため、これはコンパイラの警告です。Ypu はジェネリックを次のように指定する必要があります。

private static <K, V extends Comparable<V>> Map<K, V> sortByComparator(Map<K, V> unsortMap) {

    List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(unsortMap.entrySet());

    //sort list based on comparator
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
        @Override
         public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
           return o1.getValue().compareTo(o2.getValue());
         }
    });

    //put sorted list into map again
    Map<K, V> sortedMap = new LinkedHashMap<K, V>();
    for (Iterator<Map.Entry<K, V>> it = list.iterator(); it.hasNext();) {
         Map.Entry<K, V> entry = it.next();
         sortedMap.put(entry.getKey(), entry.getValue());
    }
    return sortedMap;
}

ここで何が起こっているかというと、ジェネリック型を指定することで、これらのコレクションに含まれるオブジェクトの型をコンパイラに伝えているということです。このため、コンパレータと 2 番目のループですべてのキャストを排除することができました。これにより、メソッドは実際にタイプ セーフになり、コンパイラによるチェックが可能になります。

コンパイラが警告で伝えていることは、生の型を使用してキャストしているため、入力の精度をチェックできないということです。もう 1 つのオプションは、@SuppressWarnings を使用してこの警告を単純に抑制することですが、実際にはメソッドの型を安全にすることをお勧めします。

于 2012-09-15T00:56:20.843 に答える