【问题标题】:Java: compareTo not sorting correctly [duplicate]Java:compareTo未正确排序[重复]
【发布时间】:2015-10-27 19:59:01
【问题描述】:

我的列表中有这个compareTo 代码:

public int compareTo(className a) 
{               
    return (this.long1 > a.long1) ? 1 : -1;
}

当我使用Collections.sort(list) 时,我收到以下错误:Comparison method violates its general contract!

当我将它更改为if (this.long1 >= a.long2) 时,它可以工作,但它不能正确排序。多头按顺序排序,然后是乱序,然后是按顺序。使用>=,输出如下:

...
2000100
2000101
2000102
1000100
1000101
2000101
2000102
...

现在,重复确实发生了,它们需要正确排序。重复出现在第一个还是最后一个并不重要,只要它们按顺序正确分组即可,如下所示:

...
2000100
2000101
2000101
2000102
2000102
1000100
1000101
...

我该如何正确地做到这一点?谢谢。

更新

列表仍在按以下所有建议进行排序。这是因为它是List<Class> list = new ArrayList<Class>(); 吗?我不能使用我习惯的 C#:List<Class> list = new List<Class>()。

【问题讨论】:

  • 你不处理相等,在这种情况下,你需要返回0。
  • Google 你的错误,有很多帖子可以解决你的问题。
  • @MarounMaroun,不是真的。这些建议都不起作用。

标签: java sorting


【解决方案1】:

当两个数字相等时你应该返回 0,或者只使用Long.compare:

public int compareTo(className a) 
{               
    return Long.compare(this.long1,a.long1);
}

【讨论】:

  • 我喜欢这个。 Long.compare().
  • 我想声明这些建议都不起作用,包括 duplicate 帖子中的所有信息,但由于帖子被标记为重复,我无能为力.仍然有同样的缺陷:列表排序无序。
  • @EduardoScissaro 您仍然可以编辑您的问题。添加相关代码、输入和输出。
  • @EduardoScissaro 您可以展示如何初始化列表,您可以展示实现compareTo 的类的代码。也许那里有一些东西可以帮助解决您的问题。
  • 发现了问题,这完全是我的错,在代码深处的某个地方,它与compareTo 混淆了。虽然这并不能解决我遇到的问题,但在删除最初甚至不应该与之交互的代码时确实是正确的。从技术上讲,这个答案仍然是正确的......因此,+1 并检查。
【解决方案2】:
return (this.long1 > a.long1) ? 1 : -1;  

如果两个数字相等,则返回 -1,而不是 0。

return (this.long1 >= a.long1) ? 1 : -1;  

现在 1 相等,但仍不是 0。
正确:

if(this.long1 > a.long1) return 1;
if(this.long1 < a.long1) return -1;
return 0;

【讨论】:

  • 虽然这不是错误的,但我会使用一些东西 stackoverflow.com/a/33367246/1085186 因为它使用库代码并且更具可读性。
【解决方案3】:

正确的解决方案是这样做:

public int compareTo(className a) {               
    return this.long1 > a.long1 ? 1 : this.long1 < a.long1 ? -1 : 0;
}

【讨论】:

  • 我刚刚添加了相同的解决方案,但顺序不同。 :p
  • 虽然这并不正确,但我会使用 stackoverflow.com/a/33367246/1085186 的东西,因为它使用库代码并且更具可读性。
猜你喜欢
  • 2018-06-13
  • 2021-12-03
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多