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