遍历HashMap并求和与相同键匹配的键值

时间:2019-07-08 15:38:33

标签: java

我正在读取的文本文件中有一组值。我如何将这些值存储在HashMap或List中,并进行比较以将其总和? 例如:

"UniqueKey1" "Tom" 1
"UniqueKey2" "Tom" 2
"UniqueKey3" "Alex" 4

因此,由于我有两个汤姆,我想对它们的值求和,即3

这是我尝试过的:

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);

                }

在这里,我试图将日期映射为关键,而我想加总的是价格

我如何将这些值添加到地图上并求和那些具有相同键值的值并将其存储?

关键是我将拥有唯一的值和重复的日期,然后将这些日期的值求和

谢谢

3 个答案:

答案 0 :(得分:3)

您无法有意义地“遍历[a] HashMap并求和与相同密钥匹配的密钥值”,因为Map不能包含同一密钥的多个映射。但是,在添加映射时,您可以保持每个键的值的总和。

执行此操作的方法有多种,但是较容易的方法之一是使用HashMap.merge()来处理添加新映射和更新现有映射的情况,视情况而定:

Map<String, Integer> myMap = new HashMap<>();

// ...
String key = "Tom";
int value = 4;

myMap.merge(key, value, (v1, v2) -> { return v1 + v2; });

答案 1 :(得分:1)

与其他答案相比,采用长方法。您可以创建一个对象。然后创建这些对象的列表,并使用流来映射和求和它们的值。

  

主要

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)

答案 2 :(得分:0)

如果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);
   }
}

在列表中每个键映射多个值的位置,然后可以循环访问。