13

Java 8 を使用して、並べ替えおよびグループ化された文字列のリストを作成する最も簡潔な方法は何ですか? Lambdas と Collections and Streams フレームワークを使用して、古い方法と新しい方法を示します。

古い(または新しい)方法でサードパーティのライブラリ(人気のあるもの)を使用して表示できます。

ただし、バニラ Java を使用することをお勧めします。これは、Java 8 での言語の変更がタスクのテーブルにもたらす変更を示しているためです。

Input: List<String>
Output: Map<Character<List<String>>
The key of map is 'A' to 'Z'
Each list in the map are sorted.

次のようにソートおよびグループ化されます...

このリストの場合:「ビール」、「リンゴ」、「バナナ」、「アナナス」、「マンゴー」、「ブルーベリー」

Map最初の文字をキーとして作成された遺言書。マップ内の値は、Listそのキー (文字) で始まるすべての単語を並べ替えたものになります。

  • キー: 値: ["Ananas","Apple"]
  • キー: B 値: ["バナナ","ビール","ブルーベリー"]
  • キー: M 値: ["マンゴー"]
4

2 に答える 2

31

サードパーティのライブラリの助けを借りずにJavaを使用すると、古い方法と新しい方法があります。Collections.sort(..) を使用すると、以前は簡単に並べ替えることができました。

古い方法の課題は、値をグループ化するために多くのコードが必要だったことです。

 - Input: List<String>
 - Output: Map<Character,<List<String>>
 - The key of map is 'A' to 'Z'
 - Each list in the map are sorted.

古いジャワ

List<String> keywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer"); 
Map<Character, List<String>> result = new HashMap<Character, List<String>>(); 
for(String k : keywords) {   
    char firstChar = k.charAt(0);     
    if(!result.containsKey(firstChar)) {     
        result.put(firstChar, new  ArrayList<String>());   
    }     
    result.get(firstChar).add(k); 
} 
for(List<String> list : result.values()) {   
    Collections.sort(list); 
}
System.out.println(result); 

新しい Java 8

List<String> keywords = Arrays.asList("Apple", "Ananas", "Mango", "Banana", "Beer");

Map<Character, List<String>> result = keywords.stream()
     .sorted()
     .collect(Collectors.groupingBy(it -> it.charAt(0)));

System.out.println(result);

ソースデータがすでに「ストリーム」になっている新しい Java 8

@KevinOの提案による

 Map<Character, List<String>> result = Stream
      .of( "Apple", "Ananas", "Mango", "Banana","Beer")
      .sorted()
      .collect(Collectors.groupingBy(it -> it.charAt(0)))

System.out.println(result);
于 2013-10-28T12:46:03.847 に答える