我正在尝试使用自定义ArrayList<String>
对Comparator
进行排序。我的要求是XX
String应该是第一个String,其他的应该遵循自然顺序。
我需要:[XX,XX,1,5,9,A,D,G,Q,Z]
我得到的是[1,5,9,A,D,G,Q,Z,XX,XX]
以下是我的代码:
public class Test {
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("Z");
list.add("5");
list.add("D");
list.add("G");
list.add("XX");
list.add("9");
list.add("Q");
list.add("XX");
list.add("1");
list.add("A");
Collections.sort(list, new CustomComparator());
System.out.println(list);
}
}
class CustomComparator implements Comparator<String>
{
@Override
public int compare(String o1, String o2) {
if(o2.equals("XX")) {
return -1;
}
return o1.compareTo(o2);
}
}
编辑:如果我将比较器逻辑更改为:
@Override
public int compare(String o1, String o2) {
if(o2.equals("XX")) {
return 1;
}
return o1.compareTo(o2);
}
我得到了:
[1,XX,9,A,Q,XX,5,D,G,Z]
请让我知道如何继续。提前谢谢。
答案 0 :(得分:2)
使用此比较器实现:
@Override
public int compare(String o1, String o2) {
if(o2.equals("XX")) {
return o1.equals("XX") ? 0 : 1;
} else if (o1.equals("XX")) {
return -1;
}
return o1.compareTo(o2);
}
原因:除了使用-1或1的问题之外,确保所有可能的o1和o2元组的明确顺序非常重要,请参阅javadoc:
[...] 实现者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x))。 (这意味着当且仅当compare(y,x)抛出异常时,compare(x,y)必须抛出异常。)
实现者还必须确保关系是传递的:((compare(x,y)&gt; 0)&amp;&amp;(compare(y,z)&gt; 0))暗示比较(x,z)&gt ; 0。 [...]
答案 1 :(得分:1)
编写方法的简明方法:
public int compare(String o1, String o2) {
if (o1.equals(o2)) return 0;
if (o1.equals("XX")) return -1;
return (o2.equals("XX")) ? 1 : o1.compareTo(o2);
}