繁体   English   中英

如何使用 java 中的两个哈希图计算比率

[英]How to calculate the ratio using two hashmaps in 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())));

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

如果使用嵌套的 for 循环, totalKeysurviveKey有 100% 不同。 因此:

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 {
            //will lead to all attributes' ratio 0.00
            surviveData.put(totalKey, (double) 0);
        }
    }
}

放置那些死人的正确方法是:

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

    // if the surviveCounts' keys aren't in the totalCount's key
    // it means they're not even survive once
    for (Map.Entry<Object, Double> entryTotal : totalCounts.entrySet()) {
        Object totalKey = entryTotal.getKey();

        if (!surviveCounts.containsKey(entryTotal.getKey())) {
            surviveData.put(totalKey, (double) 0);               
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM