java - 使用自定义比较器排序的集合不起作用

标签 java android sorting collections comparator

我创建了一个自定义比较器来对字符串的 ArrayList 进行排序。我已经通过调试器运行它并观察它正确地比较和返回值。但是,我的数组没有排序。由于我是 Java 和 Android 的新手,可能还有其他事情要发生。

看了几个小时后,我想不通是什么..而且因为我一直在使用这个网站来回答很多其他问题,所以我知道该去哪里了!

    Collections.sort(allWords, new Comparator<String>(){
        public int compare(String o1, String o2) {
            scoreWord sc1 = new scoreWord((String)o1);
            scoreWord sc2 = new scoreWord((String)o2);
            int i1 = sc1.getScore();
            int i2 = sc2.getScore(); 
            if ( i1 > i2 )
                return 1;
            return 0;
        }

        public boolean equals(String o1, String o2) {
            scoreWord sc1 = new scoreWord((String)o1);
            scoreWord sc2 = new scoreWord((String)o2);
            int i1 = sc1.getScore();
            int i2 = sc2.getScore(); 
            if ( i1 == i2 )
                return true;
            return false;
        }
     });

最佳答案

你的 compare方法不是对称的 - 它总是返回 1 或 0。

相反,只需委托(delegate)给 Integer.compare (如果它在您使用的 Java 版本中可用),传递分数:

public int compare(String o1, String o2) {
    scoreWord sc1 = new scoreWord((String)o1);
    scoreWord sc2 = new scoreWord((String)o2);
    return Integer.compare(i1, i2);
}

否则手动执行,坦率地说这是一种痛苦 - 如果您在多个地方需要它,我建议您编写自己的 Integer.compare 实现避免重复:

public int compare(String o1, String o2) {
    scoreWord sc1 = new scoreWord((String)o1);
    scoreWord sc2 = new scoreWord((String)o2);
    return i1 > i2 ? 1
         : i1 < i2 ? -1
         : 0;
}

这样你就会有适当的对称性:

  • a.compareTo(b) < 0暗示 b.compareTo(a) > 0
  • a.compareTo(b) > 0暗示 b.compareTo(a) < 0
  • a.compareTo(b) == 0暗示 b.compareTo(a) == 0

关于java - 使用自定义比较器排序的集合不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968676/

相关文章:

java - java中数字和的递归如何工作?

android - 通过 Parse 检索我的 Android 应用程序中与手机联系人匹配的用户列表

java - 按多个字段对一组字符串、整数进行排序

php - 对字母数字字符串中的中间和最后三个数字进行排序

algorithm - 编写一个程序,从 10 亿个数字的数组中找出 100 个最大的数字

java - 在表中快速查找行的算法

java - 当 Java 应用程序位于包中时,如何从命令行运行它?

带有 CSS 的矩形上的 JavaFX 图像

android - 在父类(super class)中中断 super.onCreate()

android - ListView 编辑器的 UI 设计