Java 地图<;字符串,整数>;取整整数百分比

Java 地图<;字符串,整数>;取整整数百分比,java,Java,我有一个Map和一个名为globalValue的整数。我的目标是用全局值的百分比替换map中的值,例如;(值1/全局值)*100,并对最终数字进行四舍五入 我曾尝试直接在映射中进行除法(结果是0),并尝试将映射中和映射外的整数转换为双精度(两者都导致类型不匹配) 公共地图分析(){ int globalValue=0; Map m=新的HashMap(); for(int i=0;i

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


我曾尝试直接在映射中进行除法(结果是0),并尝试将映射中和映射外的整数转换为双精度(两者都导致类型不匹配)

公共地图分析(){
int globalValue=0;
Map m=新的HashMap();
for(int i=0;i
使用流API会简单得多。您还需要使用
double
double
来避免将所有值舍入为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)));
}

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

为什么不将
的映射设为Double
而不是
Integer
?在
数组中提供一些详细信息
(value1/globalValue)*100
代码中没有除法逻辑,你能解释一下你到底需要什么吗?或者是除法逻辑?或者重新表述上述代码?正如GBlodgett建议的那样,使用Double或尝试强制转换值
(Integer)
?“我尝试直接在映射中进行除法(结果为0)”,很可能是因为您正在执行整数除法。将其中一个操作数设为双精度。然而,您当前的代码没有显示任何逻辑……好吧,我的返回类型必须是整数。@J.Doe然后返回一个整数。。只是不要用它来计算integers@J.Doe我添加了一个计算整数的解决方案,以减少精度损失。@xtratic这取决于
100*long
溢出或
100.0*long
精度损失的可能性更大。@xtratic很好,在第一个例子中,
sum
是'double',但在第二个例子中我放弃了它。
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)));
}
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)));
}