我有一个List<String>
,我必须将其转换为Map
,将相同长度的String
分组为List
,使用String
长度作为Map<Integer, List<String>> result = new TreeMap<>();
for (String str : list) {
if (!result.containsKey(str.length())) {
result.put(str.length(), new ArrayList<>());
}
result.get(str.length()).add(str);
}
键入,排序顺序。可以使用 -
$.post '/articles/' + id + '/comments',
contentType: 'application/json'
data: comment_params:
commenter: commenter
body: body
success: (data, textStatus, jQxhr) ->
console.log(textStatus)
$('#comments').append JSON.stringify(data)
dataType: 'json'
我们如何使用Java 8流做到这一点?
答案 0 :(得分:8)
可以使用分组收集器将Java流分组到地图中,最简单的方法是使用
Collectors.groupBy(comparator)
其中比较器将流值转换为映射键。
返回是从比较器键到条目列表的映射
public class Test {
public static void main(final String... args) {
List<String> in = Arrays.asList("A", "AB", "B", "ABC");
final Map<Integer, List<String>> all = in.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(all);
}
}
输出:
{1=[A, B], 2=[AB], 3=[ABC]}
答案 1 :(得分:3)
你可以用流来做:
Map<Integer, List<String>> result = list.stream()
.collect(Collectors.groupingBy(
String::length, // use length of string as key
TreeMap::new, // create a TreeMap
Collectors.toList())); // the values is a list of strings
它通过接受3个参数的Collectors.groupingBy
的重载来收集流:关键映射器函数,映射的提供者和下游收集器。
然而,有一种更简洁的方法,没有流:
Map<Integer, List<String>> result = new TreeMap<>();
list.forEach(s -> result.computeIfAbsent(s.length(), k -> new ArrayList<>()).add(s));
这使用List.forEach
和Map.computeIfAbsent
来实现您的目标。
答案 2 :(得分:2)
您可以在Java 8中使用groupingBy在一行中执行此操作。
result = list.stream().collect(Collectors.groupingBy(String::length));