使用哈希图比较键和值,并根据相似的键将值相加在一起

时间:2019-02-27 03:59:51

标签: java printing hashmap

所以我想知道如何以及是否可以使用Hashmaps(一个仅包含字符串,另一个包含类似的字符串键但带有浮点值)来进行比较,然后从该比较中打印出当它们的键/值对齐时,将第二个哈希图的浮点数加在一起。下面的示例应阐明我的意思并动态地执行此操作。

代码

HashMap<String, String> hmap = new HashMap<>();
HashMap<String, Float> h2map = new HashMap<>();
hmap.put("order1", "pending");
hmap.put("order2", "cancelled");
hmap.put("order3", "pending");

h2map.put("order1", (float) 19.95);
h2map.put("order2", (float) 19.95);
h2map.put("order3", (float) 39.9);

Set <String> singles = new HashSet<>(h2map.values());

if(h2map.keySet().equals(hmap.keySet())) {
// below prints out the states and amount of the states but how can i get the float values from hmap to be added together for the similar states and printed with their respective state?
  for(String element : singles) {               
   System.out.println(element + ": " + Collections.frequency(hmap.values(), element));          
                    }
}

当前输出

pending: 2
cancelled: 1

所需的输出

pending: 2 $59.85
cancelled 1 $19.95

2 个答案:

答案 0 :(得分:1)

这是您想要的吗?

public static void main(String[] args) {
    HashMap<String, String> hmap = new HashMap<>();
    HashMap<String, Float> h2map = new HashMap<>();

    hmap.put("order1", "pending");
    hmap.put("order2", "cancelled");
    hmap.put("order3", "pending");

    h2map.put("order1", 19.95f);
    h2map.put("order2", 19.95f);
    h2map.put("order3", 39.9f);

    Map<String, DoubleSummaryStatistics> grouping = hmap
            .entrySet()
            .stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.summarizingDouble(e -> h2map.get(e.getKey()))));

    grouping.forEach((key, value) -> System.out.println(key + ": " + value.getCount() + " " + value.getSum()));
}

请注意,BigDecimal没有汇总统计信息收集器,并且此代码仅适用于Float或Double。但是对于金钱计算,最好使用BigDecimal。如果需要,可以实施custom collector

答案 1 :(得分:1)

为了更好的准确性,我将Float的使用替换为BigDecimal。我还使用了两个映射,一个用于保存总和,另一个用于计数:

public static void main(String[] args) {
        HashMap<String, String> hmap = new HashMap<>();
        HashMap<String, BigDecimal> h2map = new HashMap<>();
        hmap.put("order1", "pending");
        hmap.put("order2", "cancelled");
        hmap.put("order3", "pending");

        h2map.put("order1", new BigDecimal("19.95"));
        h2map.put("order2", new BigDecimal("19.95"));
        h2map.put("order3", new BigDecimal("39.9"));

        //Map for holding sum 
        HashMap<String, BigDecimal> sum = new HashMap<>();

        for(String key : h2map.keySet()){
            if(hmap.get(key) != null){
                String value = hmap.get(key);
                if(sum.get(value) == null){
                    sum.put(value, h2map.get(key));
                }else{
                    sum.put(value, (sum.get(value).add(h2map.get(key))));
                }
            }
        }
        //Map for holding count
        HashMap<String, BigDecimal> countMap = new HashMap<>();
        for(Iterator<Map.Entry<String, BigDecimal>> itr = sum.entrySet().iterator(); itr.hasNext(); ){
            Map.Entry<String, BigDecimal> entry = itr.next();
            String key = entry.getKey();
            int count = Collections.frequency(hmap.values(), key);
            countMap.put((key + count), sum.get(key));
            itr.remove();
        }
        //For GC
        sum = null;
        countMap.forEach((k, v) -> System.out.println(k + " " + v));
    }