根据3个标准​​对Java字符串数组进行排序

时间:2015-12-10 20:30:02

标签: java arrays string sorting

我在Java中有一个字符串数组。我需要根据单词中的字符数量(降序)对它进行排序。如果某些单词包含相同数量的字符a,那么我需要按照它们的长度(递减顺序)对这些单词进行排序。如果长度相同,则按字母顺序排列。

示例数组:

[" aaaasd和#34;""" AAB"" aaaabcd和#34;" EF",& #34; cssssssd"" FDZ" " KF"" ZC"" lklklklklklk"" L"]

需要按如下方式排序:

[" aaaabcd"" aaaasd"" AAB"""" lklklklklklk",& #34; cssss ssd"," fdz"," ef"," kf"," zc"," l& #34;]

3 个答案:

答案 0 :(得分:2)

这应该这样做:

// compare count of 'a' chars, descending
Comparator<String> comparator = Comparator.comparing(s -> s.chars().filter(c -> c == 'a').count(), Comparator.reverseOrder());

// then string length, descending
comparator = comparator.thenComparing(String::length, Comparator.reverseOrder());

// then natural (alphabetical) order
comparator = comparator.thenComparing(Comparator.naturalOrder());

// apply sort
Arrays.sort(strArr, comparator);

答案 1 :(得分:1)

您可以在Arrays类中使用util方法:

public static <T> void sort(T[] a, Comparator<? super T> c) 

只需编写自己的Comparator实现,并将其作为参数与您希望按其排序的字符串数组一起传递。

答案 2 :(得分:1)

正如已经提到的那样,只需使用Arrays.sort()方法和自己的Comparator

Arrays.sort(arr, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        if (countA(o1) == countA(o2)) {
            if (o1.length() == o2.length()) {
                // Compare lexicographically
                return o2.compareTo(o1);
            }
            // Compare by the length
            return o2.length() - o1.length();
        }
        // Compare by the number of 'a'
        return countA(o2) - countA(o1);
    }

    private int countA(String s) {
        int total = 0;
        for (int pos = 0; pos < s.length(); ++pos) {
            if (s.charAt(pos) == 'a') {
                total++;
            }
        }
        return total;
    }
});

arrString数组。

主要思想是根据其优先级检查标准,并且只有在根据所有先前的标准对象相等时检查新标准。