使用Java 8,创建字符串排序和分组列表的最简洁方法是什么

2022-09-04 05:53:45

使用Java 8,创建字符串的排序和分组列表的最简洁方法是什么?显示使用 Lambdas 以及集合和流框架的旧方式和新方式。

您可以展示使用第三方库(流行的)旧(或新)方式。

但是,我建议使用vanilla 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.

它将进行排序和分组,以便...

给出这个列表:“啤酒”,“苹果”,“香蕉”,“阿纳纳斯”,“芒果”,“蓝莓”

遗嘱产生的包含第一个字母作为钥匙。地图中的值将是以该键(字母)开头的所有单词的排序:MapList

  • key: A 值: [“Ananas”,“Apple”]
  • 键: B 值: [“香蕉”,“啤酒”,“蓝莓”]
  • 键: M 值: [“芒果”]

答案 1

使用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);

答案 2

使用流行的第三方番石榴库,与Java 6兼容:

TreeMultimap<Character, String> multimap = TreeMultimap.create();
for (String string : list) {
  multimap.put(string.charAt(0), string);
}
return Multimaps.asMap(ImmutableListMultimap.copyOf(multimap));

这将对重复字符串进行删除,因此允许重复字符串的替代版本:

ImmutableListMultimap.Builder<Character, String> builder = 
  ImmutableListMultimap.builder();
for (String string : Ordering.natural().sortedCopy(list)) {
  builder.put(string.charAt(0), string);
}
return Multimaps.asMap(builder.build());

推荐