首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java集合排序问题

java集合排序问题
EN

Stack Overflow用户
提问于 2013-07-31 08:11:14
回答 3查看 1.7K关注 0票数 0

我使用简单的comperator,得到异常,不知道该怎么做

我就是这样称呼的:

代码语言:javascript
复制
try {
   Collections.sort(this.closePositions, new PositionComperator());
}
catch(Exception e) {
   e.printStackTrace();
}

这位是编剧:

代码语言:javascript
复制
  public class PositionComperator implements Comparator<DataResponse> {

    @Override
    public int compare( DataResponse pos1, DataResponse pos2) {

        if (pos1.openTime >= pos2.openTime) {
            return 1;
        } 
        else {
            return -1;
        }// returning 0 would merge keys

    }

   }

这是一个例外:

代码语言:javascript
复制
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(Unknown Source)
at java.util.TimSort.mergeAt(Unknown Source)
at java.util.TimSort.mergeCollapse(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at GTTask.RefreshIdentityHistory.call(RefreshIdentityHistory.java:59)
at GTTask.RefreshIdentityHistory.call(RefreshIdentityHistory.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-31 08:16:03

出现此错误的原因是,当对两个项进行排序时,它们更改了顺序。你也应该包括它是相等的情况。

最好做:

代码语言:javascript
复制
return po1.openTime - pos2.opentime;

或者做

代码语言:javascript
复制
if (pos1.openTime > pos2.openTime) {
    return 1;
} 
else if (pos1.openTime < pos2.openTime) {
    return -1;
} else {
    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2013-07-31 08:13:45

如果两个值xy具有相同的openTime,那么compare(x, y)compare(y, x)都将返回1,这违反了compare的契约。

实现者必须确保sgn(compare(x, y)) == -sgn(compare(y, x))适用于所有xy

你还没保证。

openTime值相同时,您需要考虑想要发生什么--或者返回0,或者有一些一致的概念,说明哪个值应该放在另一个值之前。例如,您是否可以进行一些次要的比较?

票数 2
EN

Stack Overflow用户

发布于 2013-07-31 08:14:33

您可以使用treeSet。İ给你安排好了。有比较的方法。例如

代码语言:javascript
复制
TreeSet<Double> sortedSet = new TreeSet<Double>(); 

例如,比较一下

代码语言:javascript
复制
TreeSet<Double> set = new TreeSet<Rock>(new Comparator<Double>()
public int compare(Double a, Double b){
                return a.value - b.value;
            }
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17964963

复制
相关文章

相似问题

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