如何计算数组中每个元素的出现次数?

时间:2021-01-13 22:16:47

标签: java

编写一个java程序或函数来计算数组中每个元素的出现次数。例如,如果 {12, 9, 12, 9, 10, 9, 10, 11} 是输入数组,则每个元素出现的次数为 {12:2, 9:3, 10:2, 11:1}

2 个答案:

答案 0 :(得分:3)

您可以使用 Map

public static Map<String, Integer> histogram(String[] arr) {
    Map<String, Integer> map = new HashMap<>();

    for(String item : arr)
        map.put(item, map.getOrDefault(item, 0) + 1);

    return map;
}

答案 1 :(得分:2)

有多种方法可以使用 LinkedHashMap 来保持插入顺序:

  1. 使用 Java 流
  • Collectors.groupingBy + Collectors.counting()
static Map<Integer, Long> frequencyCounting(int ... arr) {
    return Arrays.stream(arr)
                 .boxed()
                 .collect(Collectors.groupingBy(
                     i -> i, LinkedHashMap::new, Collectors.counting()
                 ));
}
  • Collectors.groupingBy + Collectors.summingInt
static Map<Integer, Integer> frequencySumming(int ... arr) {
    return Arrays.stream(arr)
                 .boxed()
                 .collect(Collectors.groupingBy(
                     i -> i, LinkedHashMap::new, Collectors.summingInt(i -> 1)
                 ));
}
  • Collectors.toMap
static Map<Integer, Integer> frequencyMap(int ... arr) {
    return Arrays.stream(arr)
                 .boxed()
                 .collect(Collectors.toMap(
                     x -> x, x -> 1, Integer::sum, LinkedHashMap::new
                 ));
}
  1. for 循环和 Map::merge 函数
static Map<Integer, Integer> frequencyMapMerge(int ... arr) {
    Map<Integer, Integer> map = new LinkedHashMap<>();
    for (int i : arr) {
        map.merge(i, 1, Integer::sum);
    }
    return map;
}
  • Map::compute
static Map<Integer, Integer> frequencyMapCompute(int ... arr) {
    Map<Integer, Integer> map = new LinkedHashMap<>();
    for (int i : arr) {
        map.compute(i, (k, prev) -> null == prev ? 1 : prev + 1);
    }
    return map;
}
  • Map.put + computeIfAbsent
static Map<Integer, Integer> frequencyMapCompute(int ... arr) {
    Map<Integer, Integer> map = new LinkedHashMap<>();
    for (int i : arr) {
        map.put(i, map.computeIfAbsent(i, v -> 0) + 1);
    }
    return map;
}
相关问题