嗨,我有一个整数数组,我必须把它放入一个映射键是数字的数量。我知道我应该使用流分组,但我有一个问题。
我有这样一段代码:public static Map<Integer, List<String>> groupByDigitNumbers( List<Integer> x){
return x.stream()
.collect(Collectors.groupingBy(n->Integer.toString(n).length()));
}
,但我的值应该存储为字符串列表,而不是整数还应该过滤负数,如果数字是偶数,那么字符串的开头应该有'e',如果是奇数'o'。示例[17,2,44,183,4]的输出应为1→["e2","e4";2→["o17","e44";3→["o183"
在流中为负值添加一个filter
,在groupingBy
中添加一个Collectors.mapping
来修改每个值
public static Map<Integer, List<String>> groupByDigitNumbers(List<Integer> x) {
return x.stream()
.filter(n -> n >= 0)
.collect(Collectors.groupingBy(n -> Integer.toString(n).length(),
Collectors.mapping(d -> (d % 2 == 0 ? "e" : "o") + d, Collectors.toList())));
}
List<Integer> values = List.of(-23, 17, 2, 44, 183, 4);
Map<Integer, List<String>> result = groupByDigitNumbers(values);
System.out.println(result);
// {1=[e2, e4], 2=[o17, e44], 3=[o183]}
List<Integer> data = List.of(1,10,200,-22,51,54,40442,
99291,92293,4022,402,-23, -44, -77, -88102,102,88);
Map<Integer, List<String>> map groupByDigitNumbers(data);
map.entrySet().forEach(System.out::println);
打印
1=[o1]
2=[e10, o51, e54, e88]
3=[e200, e402, e102, e102]
4=[e4022]
5=[e40442, o99291, o92293]
- 首先流式传输数字
- 然后使用
Math.log10(i) + 1
将它们按位数分组。 - 然后使用collector .mapping. 将它们映射到相应的String
public static Map<Integer, List<String>>
groupByDigitNumbers(List<Integer> list) {
return list.stream()
.filter(num -> num >= 0)
.collect(Collectors.groupingBy(
i -> (int) Math.log10(i) + 1,
Collectors.mapping(
i -> i % 2 == 0 ? "e" + i : "o" + i,
Collectors.toList())));
}