2013-07-31 112 views
0

我用简单的comperator并获得异常,不知道该怎么办Java集合排序问题

这是我如何打电话:

try { 
    Collections.sort(this.closePositions, new PositionComperator()); 
} 
catch(Exception e) { 
    e.printStackTrace(); 
} 

这是comperator:

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 

    } 

    } 

这是个例外:

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) 
+0

'sort'不能引起元素得到合并。虽然如果你要使用Set,那将是一个不同的故事。 – Dukeling

+0

你可以提供PositionComperator的代码 – Ruju

回答

1

你得到这个错误的原因是,当它整理两个项目,他们改变顺序。你也应该包括它是平等的情况。

最好这样做:

return po1.openTime - pos2.opentime; 

或做

if (pos1.openTime > pos2.openTime) { 
    return 1; 
} 
else if (pos1.openTime < pos2.openTime) { 
    return -1; 
} else { 
    return 0; 
} 
+0

什么是“返回0”会导致什么? – user502967

+0

这意味着他们是平等的,他们不会被排序。查看比较方法的java文档。 – Knubo

+0

谢谢!它正在工作 – user502967

2

如果两个值xy具有相同openTime,然后compare(x, y)compare(y, x)都将返回1,违反的compare合同:

实现程序必须确保sgn(compare(x, y)) == -sgn(compare(y, x))所有xy

您还没有确定。

你需要考虑你希望在openTime值相同的情况发生什么 - 要么返回0,或者有一些一致概念其值应该还是先等。例如,你可以执行一些次级比较吗?

+0

但条件我使用“> =” - 它不解决这个问题吗? – user502967

+0

@ user502967:不,正是我给出的原因:如果这两个值相等,那么在比较两种值时您会得到1。看看'比较'的合约。 –

+0

感谢您的解释:))) – user502967

1

你可以使用treeSet。 İt是为你排序。并且有比较方法。例如

TreeSet<Double> sortedSet = new TreeSet<Double>(); 

例如比较一下

TreeSet<Double> set = new TreeSet<Rock>(new Comparator<Double>() 
public int compare(Double a, Double b){ 
       return a.value - b.value; 
      } 
     } 
+0

为什么要在列表上使用树排序? – user502967

+0

你可以看看这个话题为什么你应该使用treeset。 Treeset直接对它进行排序和比较,你不需要另一种方法,你可以看到更简单。 http://stackoverflow.com/questions/1463284/hashset-vs-treeset – user2583040