2015-12-10 42 views
0

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

例阵列:

[ “aaaasd”, “一”, “AAB”, “aaaabcd”, “EF”, “cssssssd”, “FDZ”, “KF”, “ZC”,“lklklklklklk ”, “升”]

需要进行排序,如:

[ “aaaabcd”, “aaaasd”, “AAB”, “一”, “lklklklklklk”, “cssss SSD”, “FDZ”, “EF”, “KF”, “ZC”, “L”]

+1

你尝试的东西吗? – njzk2

+0

是的,我想通过数组循环来获取单词“a”的数字。但我在Java中是新手,我不知道这是否是一个好办法。另外,即使这是一个很好的开始方式,我也不知道在下一步的2和3标准中该怎么做。所以呆在这里。 –

+0

你有Java 8吗? – shmosel

回答

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阵列。

主要想法是根据它们的优先级来检查标准,并且只有当根据所有以前的标准相同的对象时才检查新的标准。

+0

非常感谢您的帮助。我永远不会比较自己与ifs相反的想法。我是一个Java新手,完全不知道这个用法。 –

+0

@CeyhunGanioglu没问题;)所有这样的比较器都是以相同的方式编写的,并且仅依赖于编程语言的细节。 –

1

你可以在Arrays类使用一个实用程序方法:

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

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

+0

我已经浏览了互联网上的比较器示例,但不知道如何用3个标准解决这类问题。 –

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); 
相关问题