我有一个使用哈希图的项目。我的目的是计算每个独特特征的存活率。
假设我有一个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);
}
}
执行以下操作:
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%