首页 > 解决方案 > HashMap 值的计算

问题描述

我有一个使用哈希映射的项目。我的目标是计算每个独特特征的存活率。

假设我有一个 ArrayList 来存储枚举的特征。因此,这个 ArrayList 可以包含多个重复的特征。

ArrayList<Object> allCharac = new ArrayList<Object>();
[MALE,FEMALE,FEMALE,MALE,FEMALE]


ArrayList<Object> characSurvive = new ArrayList<Object>();
[MALE,FEMALE]

因此,存活率是:

male:0.50 = 1/2 (characSurvive/allCharac)
female:0.33 = 1/3

我可以使用哈希映射来计算 ArrayList 中每个唯一值的出现。但是,如何使用每个哈希图中的值来计算比率?非常感谢任何帮助。

Map<Object,Integer> allCharacterCounts = new HashMap<Object,Integer>();
for (Object element: allCharac) {//from the above ArrayList
        if (allCharacterCounts.containsKey(element)) {
            allCharacterCounts.put(element, allCharacterCounts.get(element)+1);
        } else {
            allCharacterCounts.put(element, 1);
        }
    }

标签: javaarraylisthashmap

解决方案


执行以下操作:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

enum Character {
    MALE, FEMALE;
}

public class Main {
    public static void main(String[] args) {
        List<Character> allCharac = List.of(Character.MALE, Character.FEMALE, Character.FEMALE, Character.MALE,
                Character.FEMALE);      
        List<Character> characSurvive = List.of(Character.MALE, Character.FEMALE);

        //Create frequency map
        Map<Character, Long> allCharacFreq = allCharac.stream()
                .collect(Collectors.groupingBy(e -> e, Collectors.counting()));

        for (Character character : characSurvive) {
            System.out.println(
                    character + ": " + String.format("%.2f", ((1.0 / allCharacFreq.get(character)) * 100)) + "%");
        }
    }
}

输出:

MALE: 50.00%
FEMALE: 33.33%

如果characSurvive也可以有重复值,请替换1.0为每个值的频率characSurvive

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

enum Character {
    MALE, FEMALE;
}

public class Main {
    public static void main(String[] args) {
        List<Character> allCharac = List.of(Character.MALE, Character.FEMALE, Character.FEMALE, Character.MALE,
                Character.FEMALE);
        List<Character> characSurvive = List.of(Character.MALE, Character.MALE, Character.FEMALE);

        // Create frequency map for `allCharac`
        Map<Character, Long> allCharacFreq = allCharac.stream()
                .collect(Collectors.groupingBy(e -> e, Collectors.counting()));

        // Create frequency map for `characSurvive`
        Map<Character, Long> characSurviveFreq = characSurvive.stream()
                .collect(Collectors.groupingBy(e -> e, Collectors.counting()));

        for (Character character : characSurviveFreq.keySet()) {
            double percent = ((double) (characSurviveFreq.get(character)) / allCharacFreq.get(character)) * 100;
            System.out.println(character + ": " + String.format("%.2f", percent) + "%");
        }
    }
}

输出:

FEMALE: 33.33%
MALE: 100.00%

推荐阅读