繁体   English   中英

java unchecked cast

[英]java unchecked cast

我在Java中有一个比较器类来比较Map条目:

public class ScoreComp implements Comparator<Object> {

    public int compare(Object o1, Object o2) {

        Entry<Integer, Double> m1 = null;
        Entry<Integer, Double> m2 = null;

        try {
            m1 = (Map.Entry<Integer, Double>)o1;
            m2 = (Map.Entry<Integer, Double>)o2;
        } catch (ClassCastException ex){
            ex.printStackTrace();
        }

        Double x = m1.getValue();
        Double y = m2.getValue();
        if (x < y)
            return -1;
        else if (x == y)
            return 0;
        else
            return 1;        
     }

}

当我编译这个程序时,我得到以下内容:

warning: [unchecked] unchecked cast
found   : java.lang.Object
required: java.util.Map.Entry<java.lang.Integer,java.lang.Double>
            m1 = (Map.Entry<Integer, Double>)o1;

我需要根据Double Values对映射条目进行排序。

如果我创建了下面的比较器,那么在调用Arrays的sort函数时会出现错误(我从地图中获取一个条目集,然后使用set作为数组)。

public class ScoreComp implements Comparator<Map.Entry<Integer, Double>>

如何实现这种情况。

假设您正在使用此比较器对TreeMap进行排序,那么这不会起作用。 TreeMap比较器仅用于比较映射键,而不是key-> value条目。 如果你的比较器需要访问这些值,那么它必须在地图本身中查找它们,例如

final Map<Integer, Double> map = ....

public class ScoreComp implements Comparator<Integer>  {
   public int compare(Integer key1, Integer key2) {
    Double x = map.getValue();
    Double y = map.getValue();
    if (x < y)
        return -1;
    else if (x == y)
        return 0;
    else
        return 1; 
   }
}

编辑:从您的评论中,我认为您最好的选择是创建一个封装ID和值的类,将这些值放入List中,然后对其进行排序。

public class Item implements Comparable<Item> {
   int id;
   double value;

   public int compareTo(Item other) {
      return this.value - other.value;
   }
}

然后

List<Item> list = new ArrayList<Item>();
// ... add items here
Collections.sort(list);

由于Item本身是Comparable ,因此您不需要外部Comparator (除非您需要)。

什么是重写为

public class ScoreComp implements Comparator<Map.Entry<Integer, Double>> {

    public int compare(Map.Entry<Integer, Double> o1, Map.Entry<Integer, Double> o2) {
        if ( o1.getValue()  < o2.getValue()  ) return -1;
        else if ( o1.getValue() == o2.getValue()  ) return 0;
        return 1;
    }
}

stacker描述了如何修复你显示的代码。 以下是如何修复注释中的代码:首先,不要使用数组,因为数组不能使用泛型(您不能使用泛型类型的数组)。 相反,您可以使用ListCollections.sort()方法:

    List<Map.Entry<Integer, Double>> mList = 
        new ArrayList<Map.Entry<Integer, Double>>(Score.entrySet()); 
    Collections.sort(mList, new ScoreComp());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM