java - 使用自定义比较器对 ArrayList<String> 进行排序

标签 java sorting collections arraylist comparator

我正在尝试对 ArrayList<String> 进行排序使用自定义 Comparator .我的要求是 XX String 应该是第一个 String,其他的应该按照自然顺序。

I need : [XX, XX, 1, 5, 9, A, D, G, Q, Z]
What I am getting is [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]

请告诉我如何进行。提前致谢。

最佳答案

使用这个比较器实现:

@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)>0) && (compare(y, z)>0)) 意味着 compare(x, z)>0。 [...]

关于java - 使用自定义比较器对 ArrayList<String> 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23296627/

相关文章:

java - 如何使用 PhoneGap CLI 将更改应用到 Android Cordova 应用程序 Java 源文件?

algorithm - Radixsort的解释

Excel VBA 集合合并排序

collections - 在 Magento 中按两个类别过滤产品集合

java - 如何使用 OpenCV4 和 Android Studio(kotlin) 删除 Unresolved reference 错误

JSONObject 的 Java NoClassDefFoundError 异常

java - 如何使 JDK 成为默认的 JRE?

scala - 对由partitionBy创建的一个输出目录中的数据进行排序

JavaScript:如何高效地将对象数组 A 转换为对象数组 B?

Swift 集合扩展 : pick every other item