java - Map<String, Integer> 获取四舍五入 int 百分比

标签 java

我有一个Map<String, Integer>和一个名为 globalValue 的整数。我的目标是将 map 中的值替换为全局值的百分比,例如; (value1/globalValue)*100 并对最终数字进行四舍五入。

我尝试直接在映射中进行除法(结果为 0),并尝试将整数在映射内和映射外转换为 double (均导致类型不匹配)。

public Map<String, Integer> analyse() {
    int globalValue = 0;
    Map<String, Integer> m = new HashMap<String, Integer>();
    for (int i = 0; i < array.length; i++) {
        if (array[i].getTime() != null) {
            globalValue = globalValue + array[i].getValue();
            if (m.containsKey(array[i].getTime())) {
                m.put(array[i].getTime(), m.get(array[i].getTime()) + array[i].getValue());
            } else {
                m.put(array[i].getTime(), array[i].getValue());
            }
        }
    }
    return m;
}

最佳答案

使用 Stream API 会简单得多。您还需要使用 doubleDouble 以避免将所有值四舍五入为 0。

public Map<String, Double> analyse() {
    double sum = Stream.of(array).mapToDouble(d -> d.getValue()).sum();
    return Stream.of(array)
            .collect(Collectors.groupingBy(t -> t.getTime(),
                    Collectors.summingDouble(t -> t.getValue() * 100.0 / sum)));
}

为什么 int 值会发生这种情况?

Int division: Why is the result of 1/3 == 0?

大多数 child 在小学时学习整数除法,但一旦学习小数,似乎就忘记了。

返回整数百分比,而不会损失太多精度。

public Map<String, Integer> analyse() {
    long sum = Stream.of(array).mapToLong(d -> d.getValue()).sum();
    Map<String, Long> map = Stream.of(array)
            .collect(Collectors.groupingBy(t -> t.getTime(),
                    Collectors.summingLong(t -> t.getValue())));
    return map.entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey,
                    e -> (int) Math.round(100.0 * e.getValue() / sum)));
}

这可以处理许多小值加起来可达 1% 的情况。

关于java - Map<String, Integer> 获取四舍五入 int 百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53947390/

相关文章:

java - 使用 Java 的照片缩放器

java - 使用反射访问java中子类和父类(super class)的属性

java - 按第三个元素对字符串数组列表进行排序

java - 为什么 `setConnectionRequestTimeout` 没有停止我的 1 分钟获取请求?

java - Java 中的 SSL 自签名过期证书

java - 如何处理 java/codename one 中的请求超时?

java - 从java调用异步kotlin方法

java - Android java.lang.IllegalStateException : Could not execute method of the activity

java - 我需要一个用于 Java 或 Scala 的(简单)、不可变的 2D vector 库

java - vert.x - 可能有多少个计时器