java自定义比较器实现

ahy6op9u  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(359)

我正在写一个比较器,我可以用它来排序字符串数组使用字符计数。字符串都是小写ascii字符。
如。

input = {"art", "bash", "tar"};
Expected sorted output = {"art", "tar", "bash"};

在这里,“bash”是否在开头并不重要,但是“art”和“tar”应该是一个接一个的,没有特定的顺序,因为它们有匹配的字符计数。
我有这段代码,在这里我使用一个简单的数组来检查和保持字符计数和比较。

Comparator<String> comparator = new Comparator<String>() {

    @Override
    public int compare(String s1, String s2){
        if (s1.equals(s2)) return 0;

        int[] a1 = getCountArray(s1);
        int[] a2 = getCountArray(s2);
        if (Arrays.equals(a1, a2)) return 0; // character count matches

        return s1.compareTo(s2);
    }

    private int[] getCountArray(String s) {
        int[] array = new int[256];
        for (int i=0; i<s.length(); i++){
            array[s.charAt(i) - 'a'] ++;
        }
        return array;
    }

};
String[] input = {"art", "bash", "tar"};
Arrays.sort(input, comparator);

但是,它不起作用。我做错什么了?

gdx19jrr

gdx19jrr1#

你的比较仪不一致:
当比较“艺术”和“bash”时,它返回“艺术”小于“bash”
当比较“bash”和“tar”时,返回“bash”小于“tar”
因此,当比较“art”和“tar”时,它必须返回“art”小于“tar”(因为“art”<“bash”<“tar”),但是您的比较器返回的“art”与“tar”相同。
当你打电话的时候 Arrays.sort(input, comparator); sort方法将进行成对比较,并且总是发现“bash”必须在“tar”之前。
要修复此问题,必须替换 return s1.compareTo(s2) 与字符计数数组进行比较 a1 以及 a2 .

相关问题