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

这是一个编译器警告,因为您忽略了泛型并使用“原始”类型。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;
}

这里发生的事情是,通过指定泛型类型,您可以告诉编译器这些集合包含哪些类型的对象。因此,我能够消除比较器和第二个循环中的所有演员表。这使得该方法实际上类型安全且可由编译器检查。

编译器通过警告告诉您的是,因为您使用的是原始类型并进行强制转换,所以它无法检查您输入的准确性。另一种选择是使用@SuppressWarnings 简单地抑制此警告,但最好实际使方法类型安全。

于 2012-09-15T00:56:20.843 回答
2

我建议您查看有关如何使用集合框架的 Oracle 文档。您可以使用原始类型,但这样会失去 Java 5 中引入的用于提高代码质量和生产力的功能。

如果您是 Collections Framework 的新手,请查看http://docs.oracle.com/javase/tutorial/collections/intro/index.html。这是了解其工作原理的好来源。

As you are saying you "compiled" the program, i assume you`re not using an IDE like Eclipse to help you. I recommend you use Eclipse to help you creating your projects. It will help you with these compiler errors/warnings. Thus, it will give you some tips while you are coding, like errors, warnings and so on.

Take a look at http://www.eclipse.org/.

于 2012-09-15T01:14:58.197 回答