The*_*tor 13 java sorting lambda group-by java-8
使用Java 8,创建排序和分组的字符串列表的最简洁方法是什么?使用Lambdas和Collections and Streams框架显示旧方法和新方法.
您可以使用旧的(或新的)方式使用第三方库(流行的).
但是,我建议使用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.
Run Code Online (Sandbox Code Playgroud)
它将被分类和分组,以便......
鉴于此列表:"啤酒","苹果","香蕉","凤梨","芒果","蓝莓"
甲Map意愿产生包含第一信作为密钥.地图中的值将List是以该键(字母)开头的所有单词的排序:
The*_*tor 30
使用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.
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
正如@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);
Run Code Online (Sandbox Code Playgroud)
使用流行的第三方Guava库,与Java 6兼容:
TreeMultimap<Character, String> multimap = TreeMultimap.create();
for (String string : list) {
multimap.put(string.charAt(0), string);
}
return Multimaps.asMap(ImmutableListMultimap.copyOf(multimap));
Run Code Online (Sandbox Code Playgroud)
这会对重复字符串进行重复数据删除,因此允许重复字符串的备用版本:
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());
Run Code Online (Sandbox Code Playgroud)