我在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;]
答案 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;
}
});
arr
是String
数组。
主要思想是根据其优先级检查标准,并且只有在根据所有先前的标准对象相等时检查新标准。