首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法比较用户定义的对象进行排序(Java 8)

无法比较用户定义的对象进行排序(Java 8)
EN

Stack Overflow用户
提问于 2015-11-23 05:40:00
回答 3查看 687关注 0票数 1

我有以下课程-

代码语言:javascript
运行
复制
public class Pair
{
    public double value;
    int id;

    Pair(){
        value=0;
        id=0;
    }
    Pair(double value, int id){
        this.value=value;
        this.id=id;
    }
}

用于实现比较器类的PairComparator类

代码语言:javascript
运行
复制
public class PairComparator implements Comparator<Pair>{
    @Override
    public int compare(Pair p1, Pair p2){
        return (int)(p2.value-p1.value);
    }
}

我正试着按下面的方式对一对收藏进行排序-

代码语言:javascript
运行
复制
List<Pair> list= new ArrayList<Pair>();
list.add(new Pair(5.2, 4));
list.add(new Pair(3.4, 5));
list.add(new Pair(10.3, 3));

Collections.sort(list, new PairComparator());

不管怎么说,我都会犯错误-

线程“主”java.lang.IllegalArgumentException中的` `Exception :比较方法违反了它的一般契约!

代码语言:javascript
运行
复制
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:895)
at java.util.TimSort.mergeAt(TimSort.java:512)
at java.util.TimSort.mergeCollapse(TimSort.java:435)
at java.util.TimSort.sort(TimSort.java:241)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1454)
at java.util.Collections.sort(Collections.java:175)
at com.research.priyanshuid.recommendation_system.MatrixRecalculation.main(MatrixRecalculation.java:59)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-23 05:58:53

当比较器违反传递性- check this answer时,通常会出现此错误。

在比较器中使用double时,应避免使用子字符串逻辑。由于要将结果转换为int,它将被舍入,因此会破坏传递性,同时对5.1、5.2等值进行比较,以获得详细信息。Check this answer

最好使用比较器逻辑,如下所示:

代码语言:javascript
运行
复制
public int compare(Pair p1, Pair p2) {
   if (p1.value < p2.value) return -1;
   if (p1.value > p2.value) return 1;
   return 0;
}

正如sarilks所提到的-如果您期望NaN值更好地使用内置的比较函数-

代码语言:javascript
运行
复制
public int compare(Pair p1, Pair p2){
    return Double.compare(p1.value, p2.value);
}
票数 5
EN

Stack Overflow用户

发布于 2015-11-23 06:06:21

由于您正在比较双值,所以使用Double.compare更安全。

代码语言:javascript
运行
复制
 public int compare(Pair p1, Pair p2){
    return Double.compare(p1.value, p2.value);
}
票数 4
EN

Stack Overflow用户

发布于 2015-11-23 06:35:20

在Java-8中,您可以安全地完成这一任务,而不需要额外的PairComparator类:

代码语言:javascript
运行
复制
Collections.sort(list, Comparator.comparingDouble(p -> p.value));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33864381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档