首页 > 解决方案 > 如何在java中使用两个哈希图计算比率

问题描述

我正在构建一个程序,该程序决定哪一组人将生存并追踪所有属性。因此,我用一个ArrayList来保存幸存属性,另一个保存总属性以供将来计算生存率。

我已经确认我的属性保存正确,但我不知道我的 hashmap 代码有什么问题。它显示了一切0.00。我的想法是找到每个属性的频率,并根据其频率和键计算比率。非常感谢任何帮助或提示。

    Map<Object, Double> totalCounts = new HashMap<>();
    Map<Object, Double> surviveCounts = new HashMap<>();

    //put total characteristics in the map
   for (Object element : total) {
       if (totalCounts.containsKey(element)) {
           totalCounts.put(element, totalCounts.get(element) + (double) 1);
       } else {
           totalCounts.put(element,(double) 1);
       }

    }
    //put survived characteristics in the map
   for (Object survive : survival) {
       if (surviveCounts.containsKey(survive)) {
           surviveCounts.put (survive, surviveCounts.get(survive) + (double) 1);
       } else {
           surviveCounts.put(survive, (double) 1);
       }
    }

    for (Map.Entry<Object, Double> entrySurvive : surviveCounts.entrySet()) {

        Object surviveKey = entrySurvive.getKey();
        Double surviveValue = entrySurvive.getValue();

        for (Map.Entry<Object, Double> entryTotal : totalCounts.entrySet()) {

            Object totalKey = entryTotal.getKey();
            Double totalValue = entryTotal.getValue();

            if (totalKey.equals(surviveKey)) {
                double percent = surviveValue / totalValue;
                surviveData.put(surviveKey, percent);
            } else {
                surviveData.put(totalKey, (double) 0);
            }
        }
    }
    //print out the ratio
    surviveData.entrySet().stream()
            .sorted((k1, k2) -> -k1.getValue().compareTo(k2.getValue()))
            .forEach(k -> System.out.println(k.getKey().toString().toLowerCase() + ": " +String.format("%.2f", k.getValue())));

标签: javahashmap

解决方案


只要更新,如果surviceKey is equal to totalKey

       for (Map.Entry<Object, Double> entrySurvive : surviveCounts.entrySet()) {
            Object surviveKey = entrySurvive.getKey();
            Double surviveValue = entrySurvive.getValue();

            for (Map.Entry<Object, Double> entryTotal : totalCounts.entrySet()) {

                Object totalKey = entryTotal.getKey();
                Double totalValue = entryTotal.getValue();

                if (totalKey.equals(surviveKey)) {
                    double percent = surviveValue / totalValue;
                    surviveData.put(surviveKey, percent);
                }
            }
        }

或者你可以写,

Map<Object, Double> surviveData = surviveCounts.keySet().stream()
                .filter(totalCounts::containsKey)
                .collect(
Collectors.toMap(k -> k, k->surviveCounts.get(k)/totalCounts.get(k)));

推荐阅读