Java 遍历HashMap并对匹配同一个键的键值求和
我在读取的文本文件中有一组值。如何将这些值存储在HashMap或列表中,并与以后的求和进行比较? 例: 既然我有两个Tom,我想求和它们的值,也就是3 这就是我尝试过的:Java 遍历HashMap并对匹配同一个键的键值求和,java,Java,我在读取的文本文件中有一组值。如何将这些值存储在HashMap或列表中,并与以后的求和进行比较? 例: 既然我有两个Tom,我想求和它们的值,也就是3 这就是我尝试过的: Double counter = 0.0; Map<String, Double> dataMap = new HashMap<String, Double>(); Iterator iterator = dataMap.entrySet().iterator(); List<String>
Double counter = 0.0;
Map<String, Double> dataMap = new HashMap<String, Double>();
Iterator iterator = dataMap.entrySet().iterator();
List<String> matchingKeys = new ArrayList<>();
String dataFile = propertiesGetterUtilObj.getNewFilePath();
Path path = Paths.get(dataFile);
if(path != null) {
BufferedReader reader = Files.newBufferedReader(path);
String lineValue = null;
while ((lineValue = reader.readLine()) != null) {
String tradeId = token[0];
String date = token[1];
Double price = Double.parseDouble(token[2]);
dataMap.put(date, price);
}
双计数器=0.0;
Map dataMap=newhashmap();
迭代器迭代器=dataMap.entrySet().Iterator();
List matchingKeys=new ArrayList();
String dataFile=propertiesGetterUtilObj.getNewFilePath();
Path Path=Path.get(数据文件);
如果(路径!=null){
BufferedReader reader=Files.newBufferedReader(路径);
字符串lineValue=null;
而((lineValue=reader.readLine())!=null){
字符串tradeId=token[0];
字符串日期=令牌[1];
Double price=Double.parseDouble(令牌[2]);
dataMap.put(日期、价格);
}
在这里,我试图将日期映射为关键,我想求和的是价格
如何将这些值添加到映射中,并将具有相同键值的值相加并存储
关键是我将有唯一的值和重复的日期,然后我将对这些日期的值求和
谢谢您不能有意义地“迭代[a]哈希映射和与[a]相同键匹配的求和键值”,因为映射
不能包含同一键的多个映射。但是,您可以在添加映射时维护每个键的值的运行总和
有多种方法可以做到这一点,但其中一种更简单的方法是根据需要处理添加新映射和更新现有映射:
Map<String, Integer> myMap = new HashMap<>();
// ...
String key = "Tom";
int value = 4;
myMap.merge(key, value, (v1, v2) -> { return v1 + v2; });
Map myMap=newhashmap();
// ...
String key=“Tom”;
int值=4;
merge(键,值,(v1,v2)->{returnv1+v2;});
如果John的答案不是您感兴趣的,您可以创建一个类来映射多个键值。它看起来像这样:
public class MultiMap<T> {
Map<Object, ArrayList<T>> multiMap = new HashMap<Object, ArrayList<T>>();
public void store(Object key, T value){
if(!multiMap.containsKey(key)){
multiMap.put(key, new ArrayList<T>());
}
multiMap.get(key).add(value);
}
public ArrayList<T> get(Object key){
return multiMap.get(key);
}
}
公共类多重映射{
Map multiMap=新的HashMap();
公共无效存储(对象键,T值){
如果(!multiMap.containsKey(键)){
put(key,newarraylist());
}
multiMap.get(key).add(value);
}
公共ArrayList get(对象键){
返回multiMap.get(键);
}
}
您可以在列表中为每个键映射多个值,然后进行迭代。与其他答案相比,这是一种很长的方法。您可以创建一个对象。然后创建这些对象的列表,并使用流映射和求和它们的值 主要 输出
我将在一秒钟内发布它。我将创建一个具有
String
名称和int
值的对象。然后您可以使用相同的名称对值求和。@Hulk请查看代码更改这似乎是一个很好的解决方案,我忘记了唯一值。我现在正在尝试,谢谢一个问题,如果我有3个值怎么办?例如,我有一个唯一的键,th输入名称“Tom”,然后输入值。因为在您的回答中,您假设“Tom”不会重复,但重点是我会有唯一的值和重复的日期,然后我会对这些值求和dates@Spyky,在得到答案后修改你的问题是非常糟糕的,尤其是以影响答案适用性的方式。这就是你所做的。从这里开始的正确方法是我希望你能收回编辑,并提出一个新的问题和你的替代要求。我的解释是错误的,回答的人显然不是understanding@spyky,“我有错误的解释”==“我问了一个与我想问的不同的问题”。在得到答案后修改问题仍然是一种糟糕的形式,即使只有通过答案你才认识到问题的问题。这对我来说有点高级,这样可以将同一个键的值存储在1个数组列表中的1个对象中?是的!你看,java的普通映射将为每个值存储一个键,因此如果你有一个key称为“Fruit”,它已经映射了值40,当你为键“Fruit”放置另一个值时,它将覆盖40并放置新值。因此我经常使用的一个技巧是,我创建了一个类,将键映射到列表。通过这样做,我可以为每个键映射多个值,而不是一个。而不是“Fruit”=40,它变成“水果”={40、20、30等}
public class MultiMap<T> {
Map<Object, ArrayList<T>> multiMap = new HashMap<Object, ArrayList<T>>();
public void store(Object key, T value){
if(!multiMap.containsKey(key)){
multiMap.put(key, new ArrayList<T>());
}
multiMap.get(key).add(value);
}
public ArrayList<T> get(Object key){
return multiMap.get(key);
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
* @author blj0011
*/
public class JavaApplication24 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
List<PersonValueObject> data = new ArrayList();
data.add(new PersonValueObject("Tom", 1));
data.add(new PersonValueObject("Tom", 2));
data.add(new PersonValueObject("Alex", 4));
Map<String, Integer> result = data.stream().collect(Collectors.groupingBy(PersonValueObject::getName, Collectors.summingInt(PersonValueObject::getValue)));
for (Map.Entry<String,Integer> entry : result.entrySet())
System.out.println("Key = " + entry.getKey() +
", Value = " + entry.getValue());
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication24;
/**
*
* @author blj0011
*/
public class PersonValueObject {
private String name;
private int value;
public PersonValueObject(String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
run:
Key = Alex, Value = 4
Key = Tom, Value = 3
BUILD SUCCESSFUL (total time: 0 seconds)