Java 使用Hashmaps比较键和值,并基于相似键将值相加

Java 使用Hashmaps比较键和值,并基于相似键将值相加,java,printing,hashmap,Java,Printing,Hashmap,所以我想知道如何以及是否可能使用Hashmaps,一个只包含字符串,另一个包含类似的字符串键但有一个浮点值,来比较它们,然后从比较中打印出第一个hashmap中类似值的数量,然后,当第二个hashmap的键/值对齐时,它们的float被添加到一起。下面的例子应该阐明我的意思,并动态地执行此操作 代码 HashMap<String, String> hmap = new HashMap<>(); HashMap<String, Float> h2map = ne

所以我想知道如何以及是否可能使用Hashmaps,一个只包含字符串,另一个包含类似的字符串键但有一个浮点值,来比较它们,然后从比较中打印出第一个hashmap中类似值的数量,然后,当第二个hashmap的键/值对齐时,它们的float被添加到一起。下面的例子应该阐明我的意思,并动态地执行此操作

代码

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
这是你想要的吗

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()));
}
publicstaticvoidmain(字符串[]args){
HashMap hmap=新的HashMap();
HashMap h2map=新的HashMap();
hmap.put(“订单1”、“待定”);
hmap.put(“订单2”,“取消”);
hmap.put(“订单3”,“待定”);
h2map.put(“订单1”,19.95f);
h2map.put(“订单2”,19.95f);
h2map.put(“订单3”,39.9f);
地图分组=hmap
.entrySet()
.stream()
.collect(Collectors.groupingBy(Map.Entry::getValue,Collectors.summaringdouble(e->h2map.get(e.getKey())));
grouping.forEach((key,value)->System.out.println(key+”:“+value.getCount()+”+value.getSum());
}

请注意,BigDecimal没有汇总统计数据收集器,此代码仅适用于Float或Double。但对于货币计算,最好使用BigDecimal。如果需要的话,可以实现)我已经用
BigDecimal
替换了
Float
的用法,以提高精度。我还使用了两个映射,一个用于保存求和值,另一个用于计数:

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));
    }
publicstaticvoidmain(字符串[]args){
HashMap hmap=新的HashMap();
HashMap h2map=新的HashMap();
hmap.put(“订单1”、“待定”);
hmap.put(“订单2”,“取消”);
hmap.put(“订单3”,“待定”);
h2map.put(“订单1”,新的大十进制(“19.95”);
h2map.put(“订单2”,新的大十进制(“19.95”);
h2map.put(“订单3”,新的大十进制(“39.9”);
//求和图
HashMap sum=新的HashMap();
for(字符串键:h2map.keySet()){
如果(hmap.get(key)!=null){
字符串值=hmap.get(键);
if(sum.get(value)==null){
sum.put(值,h2map.get(键));
}否则{
sum.put(value)(sum.get(value).add(h2map.get(key));
}
}
}
//等待计数的映射
HashMap countMap=新HashMap();
for(迭代器itr=sum.entrySet().Iterator();itr.hasNext();){
Map.Entry=itr.next();
String key=entry.getKey();
int count=Collections.frequency(hmap.values(),key);
countMap.put((键+计数),sum.get(键));
itr.remove();
}
//用于GC
总和=零;
countMap.forEach((k,v)->System.out.println(k+“”+v));
}

试着把它修好一点,还有更好的吗?你可以做1件事找到两个HashMap的并集,比如HashSet unionKeys=newhashset(map1.keySet());unionKeys.addAll(map2.keySet());当尝试此操作时,我得到一个“无法推断map1.KEYSETY上HashSet错误的类型参数”。您提到这两个映射中的键是“相似的”…那么如果这两个键集不完全相同怎么办?例如,您的“顺序4”与“50.0”在第二张地图中,而不是第一张地图中,您对结果有何期望?@在这种情况下,订单4将被完全忽略。只有在两个键完全匹配的情况下,我才希望能够打印出类似键的数量,例如“待定2”,然后打印出两个待定订单的合并价格,例如“59.85”,用于一行语句pending 2 59.85“在第
sum.put(value,(sum.get(value).add(h2map.get(key)))行上获取错误;
给出方法add(Float)的
使用浮点数时,类型Float
错误未定义。是否严格使用bigdecimal方法执行此操作?@BretHasel是的,不要混淆您的代码和我的代码,请仅尝试我的代码,因为我已完全删除了浮点数。请参阅我已使用
bigdecimal
初始化了两个映射我不熟悉bigdecimal,你能解析一个类似于解析浮点的文件中的字符串吗?例如,
float-pkgPrices=float.parseFloat(lineSplit[6].trim());
bigdecimal也能做这个功能吗?这是我试图坚持的唯一原因float@BretHasel,
BigDecimal pkgPrices=新的BigDecimal(lineSplit[6].trim());
。以避免浮点错误。