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

时间:2011-08-06 18:09:58

标签: java android sorting collections comparator

我创建了一个自定义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;
        }
     });

3 个答案:

答案 0 :(得分:19)

您的compare方法不对称 - 始终返回1或0。

相反,只需委托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

答案 1 :(得分:12)

试试这个:

   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;
        } else if ( i1 < i2 ) {
            return -1;
        } else {
            return 0;
        }
    }

答案 2 :(得分:2)

你的比较器应该返回类似于:

的东西

<强>返回: 第一个参数的负整数,零或正整数小于,等于或大于第二个参数。

Source

相关问题