排序的ArrayList 自定义比较(Sorting an ArrayList

2019-10-20 00:47发布

我试图理清一个ArrayList<String>使用自定义Comparator 。 我的要求是, XX字符串应该是第一个字符串,其他人应该遵循自然顺序。

我需要:[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,X-X,5,d,G,Z]

请让我知道如何着手。 提前致谢。

Answer 1:

使用此比较的实现:

@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 :

[...]实现程序必须确保SGN(比较(X,Y))== -sgn(对比(Y,X))对于所有的x和y。 (这意味着比较(X,Y)当且仅当比较(Y,X)抛出一个异常必须抛出异常。)

实现者还必须确保关系是可传递:((比较(X,Y)> 0)&&(比较(Y,Z)> 0))意味着比较(X,Z)> 0。 [...]



Answer 2:

写方法简明的方法:

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


文章来源: Sorting an ArrayList with custom Comparator