2015-12-10 44 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); 
相關問題