总结数组列表中对象的值 (Java)
Sum up values of object in Array List (Java)
我有key/value这样的
("A", 2.2);
("A", 1.1);
("B", 4.0);
("B", 2.0);
("C", 2.5);
("A", 2.0);
("A", 2.2);
("A", 1.0);
我希望得到的结果是
A=3.3
B=6.0
C=2.5
A=5.2
我试过代码
static LinkedHashMap<String, Double> map = new LinkedHashMap<String, Double>();
public static void putAndIncrement(String key, double value) {
Double prev = map.get(key);
Double newValue = value;
if (prev != null) {
newValue += prev;
}
double roundOff = Math.round(newValue * 10.0) / 10.0;
map.put(key,roundOff);
}
然而结果是
A=8.5
B=6.0
C=2.5
Hashmap、Map、LinkedHashmap 不是获得我预期结果的正确方法。对于这种情况,您能咨询我其他方法吗?
请帮助我如何获得它或任何对我真正有帮助的建议。谢谢
一个LinkedHashMap
仍然是一个Map
,这意味着键是唯一的。地图只是不能同时有两个"A"
键。
如果要对连续键的值求和,需要用一个List
和一个class来存储key/value对:
static List<KeyValue> list = new ArrayList<>();
public static void putAndIncrement(String key, double value) {
KeyValue keyValue = (list.isEmpty() ? null : list.get(list.size() - 1));
if (keyValue == null || ! key.equals(keyValue.getKey())) {
list.add(new KeyValue(key, value));
} else {
keyValue.addValue(value);
}
}
public final class KeyValue {
private final String key;
private double value;
public KeyValue(String key, double value) {
this.key = key;
this.value = value;
}
public void addValue(double value) {
this.value += value;
}
public String getKey() {
return this.key;
}
public double getValue() {
return this.value;
}
@Override
public String toString() {
return this.key + "=" + this.value;
}
}
测试
putAndIncrement("A", 2.2);
putAndIncrement("A", 1.1);
putAndIncrement("B", 4.0);
putAndIncrement("B", 2.0);
putAndIncrement("C", 2.5);
putAndIncrement("A", 2.0);
putAndIncrement("A", 2.2);
putAndIncrement("A", 1.0);
System.out.println(list);
输出
[A=3.3000000000000003, B=6.0, C=2.5, A=5.2]
我有key/value这样的
("A", 2.2);
("A", 1.1);
("B", 4.0);
("B", 2.0);
("C", 2.5);
("A", 2.0);
("A", 2.2);
("A", 1.0);
我希望得到的结果是
A=3.3
B=6.0
C=2.5
A=5.2
我试过代码
static LinkedHashMap<String, Double> map = new LinkedHashMap<String, Double>();
public static void putAndIncrement(String key, double value) {
Double prev = map.get(key);
Double newValue = value;
if (prev != null) {
newValue += prev;
}
double roundOff = Math.round(newValue * 10.0) / 10.0;
map.put(key,roundOff);
}
然而结果是
A=8.5
B=6.0
C=2.5
Hashmap、Map、LinkedHashmap 不是获得我预期结果的正确方法。对于这种情况,您能咨询我其他方法吗? 请帮助我如何获得它或任何对我真正有帮助的建议。谢谢
一个LinkedHashMap
仍然是一个Map
,这意味着键是唯一的。地图只是不能同时有两个"A"
键。
如果要对连续键的值求和,需要用一个List
和一个class来存储key/value对:
static List<KeyValue> list = new ArrayList<>();
public static void putAndIncrement(String key, double value) {
KeyValue keyValue = (list.isEmpty() ? null : list.get(list.size() - 1));
if (keyValue == null || ! key.equals(keyValue.getKey())) {
list.add(new KeyValue(key, value));
} else {
keyValue.addValue(value);
}
}
public final class KeyValue {
private final String key;
private double value;
public KeyValue(String key, double value) {
this.key = key;
this.value = value;
}
public void addValue(double value) {
this.value += value;
}
public String getKey() {
return this.key;
}
public double getValue() {
return this.value;
}
@Override
public String toString() {
return this.key + "=" + this.value;
}
}
测试
putAndIncrement("A", 2.2);
putAndIncrement("A", 1.1);
putAndIncrement("B", 4.0);
putAndIncrement("B", 2.0);
putAndIncrement("C", 2.5);
putAndIncrement("A", 2.0);
putAndIncrement("A", 2.2);
putAndIncrement("A", 1.0);
System.out.println(list);
输出
[A=3.3000000000000003, B=6.0, C=2.5, A=5.2]