gpt4 book ai didi

java - 困惑如何在另一个类中键入比较器

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:40 25 4
gpt4 key购买 nike

我正在尝试对两个 LinkedHashMap 的值进行排序。我可以编译它并运行代码,但它告诉我在编译期间使用 -Xlint 选项,因为它是不安全的代码。它与类型转换有关,但我对如何去做感到非常困惑。我得到了这门课,我把它放在我的课上:

static class MyComparator implements Comparator {

public int compare(Object obj1, Object obj2){
int result=0;
Map.Entry e1 = (Map.Entry)obj1 ;
Map.Entry e2 = (Map.Entry)obj2 ;//Sort based on values.

Integer value1 = (Integer)e1.getValue();
Integer value2 = (Integer)e2.getValue();

if(value1.compareTo(value2)==0){

String word1=(String)e1.getKey();
String word2=(String)e2.getKey();

//Sort String in an alphabetical order
result=word1.compareToIgnoreCase(word2);

} else {
//Sort values in a descending order
result=value2.compareTo( value1 );
}

return result;
}

}

我试图在我的一个函数中调用它:

ArrayList myArrayList=new ArrayList(this.map_freq_by_date.entrySet());
Collections.sort(myArrayList, new MyComparator());
Iterator itr=myArrayList.iterator();

注意:this.map_freq_by_date定义如下:

Map<String,Integer> map_freq_by_date = new LinkedHashMap<String,Integer>();

我使用 -Xlint 选项得到的错误:

unchecked call to ArrayList(java.util.Collection<? extends E>) as a member of the raw type java.util.ArrayList
ArrayList myArrayList=new ArrayList(this.map_freq_by_date.entrySet());


unchecked conversion
found LogGrep.MyComparator
required: java.util.Comparator(? super T>
Collections.sort(myArrayList, new MyComparator());

unchecked method invocation: <T>sort(java.util.List<T>,java.util.Comparator<? super T> in java.util.Collections is applied to (java.util.ArrayList,LogGrep.MyComparator)
Collections.sort(myArrayList, new MyComparator());

帮助解决这些问题将不胜感激。我在网上查看并尝试了所有显示的内容,但我似乎无法做到正确。

注意:如果我输入 ArrayList<Object> myArrayList = new ArrayList<Object> ...错误更改为:

unchecked method invocation <T>sort(java.util.List<T>,java.util.Comparator<> super T?) in java.util.Collections is applied ot (java.util.ArraList<java.lang.Object>,LogGrep.MyComparator)
Collections.sort(myArrayList, new MyComparator());

最佳答案

比较器是一个通用接口(interface)。这样做:

static class MyComparator implements Comparator<Map.Entry<String, Integer>> {
public int compare(Map.Entry<String, Integer> obj1, Map.Entry<String, Integer> obj2){
...
}
}

并将您的列表定义为

List<Map.Entry<String, Integer>> myArrayList = new ArrayList<Map.Entry<String, Integer>>()

编译器会再次高兴。

阅读the Generics Tutorial获取更多信息。或者 Angelika Langer's Generics FAQ .

顺便说一句,除非您的 Comparator 需要运行时参数或具有可变状态,否则您应该将其定义为常量而不是为每次调用创建一个新实例

关于java - 困惑如何在另一个类中键入比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com