如何在 Java 8 中的重复键映射中添加值
How to add values in duplicated key Map in Java 8
我想在 Java 中的重复键映射中添加值 8.
举个例子:
例如:如果 strArr 是 ["B:-1", "A:1", "B:3", "A:5"]
那么我的程序应该 return 字符串 A:6,B:2
.
我的最终输出字符串应该 return 按字母顺序排列的键。排除求和后值为0
的键。
输入:new String[] {"X:-1", "Y:1", "X:-4", "B:3", "X:5"}
输出:B:3,Y:1
输入:new String[] {"Z:0", "A:-1"}
输出:A:-1
尝试过的代码:
public static String Output(String[] strArr) {
//strArr = new String[] {"X:-1", "Y:1", "X:-4", "B:3", "X:5"};
Map<String, Double> kvs =
Arrays.asList(strArr)
.stream()
.map(elem -> elem.split(":"))
.collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1])));
kvs.entrySet().forEach(entry->{
System.out.println(entry.getKey() + " " + entry.getValue());
});
return strArr[0];
}
错误:
Exception in thread "main" java.lang.IllegalStateException: Duplicate key -1.0
我该如何解决这个问题?
您应该在第一个流中声明合并策略:
.collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1]), Double::sum));
然后按零值过滤地图:
.filter(s-> s.getValue() != 0)
按键排序使用:
.sorted(Map.Entry.comparingByKey())
结果代码:
String [] strArr = new String[] {"X:-1", "Y:1", "X:-4", "B:3", "X:5"};
Map<String, Double> kvs =
Arrays.asList(strArr)
.stream()
.map(elem -> elem.split(":"))
.collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1]), Double::sum));
kvs.entrySet().stream()
.filter(s-> s.getValue() != 0)
.sorted(Map.Entry.comparingByKey())
.forEach(entry->{
System.out.println(entry.getKey() + " " + entry.getValue());w
});
它对我有用,我使用 Integer 而不是 double 和 summaringInt()
函数求和具有相同键的值:
String[] strArr = new String[] { "X:-1", "Y:1", "X:-4", "B:3", "X:5" };
Map<String, IntSummaryStatistics> collect = Arrays.asList(strArr)
.stream()
.map(elem -> elem.split(":"))
.collect(Collectors.groupingBy(e -> e[0], Collectors.summarizingInt(e -> Integer.parseInt(e[1]))));
System.out.println("Result:");
collect.entrySet().stream()
.filter(e -> e.getValue().getSum() != 0)
.sorted(Map.Entry.comparingByKey())
.forEach(e -> System.out.println("Key : " + e.getKey() + ", Value : " + e.getValue().getSum()));
也可以使用Collectors.groupingBy
+ Collectors.summingDouble
通过收集到TreeMap
:
来构建排序的kvs
映射
String [] strArr = new String[] {"X:-1", "Y:1", "X:-4", "B:3", "X:5"};
Map<String, Double> kvs = Arrays.stream(strArr)
.map(elem -> elem.split(":"))
.collect(Collectors.groupingBy(
e -> e[0],
TreeMap::new, // sort by key
Collectors.summingDouble(e -> Double.parseDouble(e[1]))
));
System.out.println(kvs); // entries with 0 value yet to be removed
// output
// {B=3.0, X=0.0, Y=1.0}
如果只需要打印上述格式的地图,不带0值,可以这样做:
System.out.println(
kvs.entrySet().stream()
.filter(e -> e.getValue() != 0)
.map(e -> new StringBuilder(e.getKey()).append(':').append(e.getValue().intValue()) )
.collect(Collectors.joining(","))
);
// output
// B:3,Y:1
如果需要从 kvs
中删除 0 个值,则可以将 removeIf
应用于其条目集:
kvs.entrySet().removeIf(e -> e.getValue() == 0);
System.out.println(kvs);
// output
// {B=3.0, Y=1.0}
我想在 Java 中的重复键映射中添加值 8.
举个例子:
例如:如果 strArr 是 ["B:-1", "A:1", "B:3", "A:5"]
那么我的程序应该 return 字符串 A:6,B:2
.
我的最终输出字符串应该 return 按字母顺序排列的键。排除求和后值为0
的键。
输入:new String[] {"X:-1", "Y:1", "X:-4", "B:3", "X:5"}
输出:B:3,Y:1
输入:new String[] {"Z:0", "A:-1"}
输出:A:-1
尝试过的代码:
public static String Output(String[] strArr) {
//strArr = new String[] {"X:-1", "Y:1", "X:-4", "B:3", "X:5"};
Map<String, Double> kvs =
Arrays.asList(strArr)
.stream()
.map(elem -> elem.split(":"))
.collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1])));
kvs.entrySet().forEach(entry->{
System.out.println(entry.getKey() + " " + entry.getValue());
});
return strArr[0];
}
错误:
Exception in thread "main" java.lang.IllegalStateException: Duplicate key -1.0
我该如何解决这个问题?
您应该在第一个流中声明合并策略:
.collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1]), Double::sum));
然后按零值过滤地图:
.filter(s-> s.getValue() != 0)
按键排序使用:
.sorted(Map.Entry.comparingByKey())
结果代码:
String [] strArr = new String[] {"X:-1", "Y:1", "X:-4", "B:3", "X:5"};
Map<String, Double> kvs =
Arrays.asList(strArr)
.stream()
.map(elem -> elem.split(":"))
.collect(Collectors.toMap(e -> e[0], e -> Double.parseDouble(e[1]), Double::sum));
kvs.entrySet().stream()
.filter(s-> s.getValue() != 0)
.sorted(Map.Entry.comparingByKey())
.forEach(entry->{
System.out.println(entry.getKey() + " " + entry.getValue());w
});
它对我有用,我使用 Integer 而不是 double 和 summaringInt()
函数求和具有相同键的值:
String[] strArr = new String[] { "X:-1", "Y:1", "X:-4", "B:3", "X:5" };
Map<String, IntSummaryStatistics> collect = Arrays.asList(strArr)
.stream()
.map(elem -> elem.split(":"))
.collect(Collectors.groupingBy(e -> e[0], Collectors.summarizingInt(e -> Integer.parseInt(e[1]))));
System.out.println("Result:");
collect.entrySet().stream()
.filter(e -> e.getValue().getSum() != 0)
.sorted(Map.Entry.comparingByKey())
.forEach(e -> System.out.println("Key : " + e.getKey() + ", Value : " + e.getValue().getSum()));
也可以使用Collectors.groupingBy
+ Collectors.summingDouble
通过收集到TreeMap
:
kvs
映射
String [] strArr = new String[] {"X:-1", "Y:1", "X:-4", "B:3", "X:5"};
Map<String, Double> kvs = Arrays.stream(strArr)
.map(elem -> elem.split(":"))
.collect(Collectors.groupingBy(
e -> e[0],
TreeMap::new, // sort by key
Collectors.summingDouble(e -> Double.parseDouble(e[1]))
));
System.out.println(kvs); // entries with 0 value yet to be removed
// output
// {B=3.0, X=0.0, Y=1.0}
如果只需要打印上述格式的地图,不带0值,可以这样做:
System.out.println(
kvs.entrySet().stream()
.filter(e -> e.getValue() != 0)
.map(e -> new StringBuilder(e.getKey()).append(':').append(e.getValue().intValue()) )
.collect(Collectors.joining(","))
);
// output
// B:3,Y:1
如果需要从 kvs
中删除 0 个值,则可以将 removeIf
应用于其条目集:
kvs.entrySet().removeIf(e -> e.getValue() == 0);
System.out.println(kvs);
// output
// {B=3.0, Y=1.0}