使用自定义Comparator </string>对ArrayList <string>进行排序

时间:2014-04-25 15:01:06

标签: java sorting collections arraylist comparator

我正在尝试使用自定义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]

请让我知道如何继续。提前谢谢。

2 个答案:

答案 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);
}