【问题标题】:HashMap stream with criteria Math.abs(double)具有条件 Math.abs(double) 的 HashMap 流
【发布时间】:2020-09-29 01:12:08
【问题描述】:

请帮助我学习在地图之间导航。我有一个 Map

的哈希图
sourceHashMapFind=.put("AAA", Arrays.asList(-5.6, 7.9, 5.7, 6.3));
sourceHashMapFind=.put("BBB", Arrays.asList(0.6, 5.8, 6.9, 8.0));
sourceHashMapFind=.put("CCC", Arrays.asList(0.5, 5.6, 6.9, 8.0));

我想生成另一个 ==> HashMap

的映射

这是我的标准。如果 0 位置的绝对值大于 1。 --> 则将 Key 和 Value 保存到新的 queryPositions hashmap 中。提前谢谢!

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

public class NewClass {

    public static void main(String[] args) {

        Map<String, List<Double>> sourceHashMapFind = new HashMap<>();

        sourceHashMapFind.put("AAA", Arrays.asList(-5.6, 7.9, 5.7, 6.3));
        sourceHashMapFind.put("BBB", Arrays.asList(0.6, 5.8, 6.9, 8.0));
        sourceHashMapFind.put("CCC", Arrays.asList(0.5, 5.6, 6.9, 8.0));

        
        
         HashMap<String, Double> queryPositions = sourceHashMapFind.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByKey())
                .filter(entry -> Math.abs(entry.getValue().get(0)) > 1.0)
                .distinct()
                .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue()));
    }
    
    
}

这是运行输出

run:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types: inference variable R has incompatible bounds
    equality constraints: java.util.Map<K,U>
    upper bounds: java.util.HashMap<java.lang.String,java.lang.Double>,java.lang.Object
    at P2020_0928_stackOverflow_MyQuestion.NewClass.main(NewClass.java:21)
C:\Users\User1\AppData\Local\NetBeans\Cache\9.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\User1\AppData\Local\NetBeans\Cache\9.0\executor-snippets\run.xml:94: Java returned: 1
BUILD FAILED (total time: 1 second)    

请查看消息。谢谢你们! https://i.stack.imgur.com/iaK7j.jpg

【问题讨论】:

  • 您的预期输出是什么?您拥有的代码的输出是什么?
  • 嗨,也许使用entry.getValue().get(0) 作为toMap 函数的值部分。
  • @Sweeper:预期的输出应该是存储字符串“AAA”和保存到 HashMap 查询位置的双精度值 -5.6。因为 (-5.6) 的绝对值大于 1.0。
  • @IronMan:尝试了这个建议,它不起作用。这是到目前为止的输出。谢谢你们。
  • 最终地图的价值应该是多少?列表的第一个值?它的绝对值?列表中所有值的总和?请澄清

标签: java java-8 hashmap java-stream key-value


【解决方案1】:

您已经很接近了,但是对条目进行排序然后收集到默认映射 (HashMap) 是没有意义的,它不会保留插入顺序。还有,你为什么用.distinct()

我会这样做:

Map<String, Double> queryPositions = sourceHashMapFind.entrySet().stream()
    .filter(e -> Math.abs(e.getValue().get(0)) > 1.0)
    .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().get(0)));

这假设您希望每个列表的第一项作为新映射的每个条目的值。

如果您需要按键排序的条目,您可能需要创建一个TreeMap

Map<String, Double> queryPositions = sourceHashMapFind.entrySet().stream()
    .filter(e -> Math.abs(e.getValue().get(0)) > 1.0)
    .collect(Collectors.toMap(
        e -> e.getKey(), 
        e -> e.getValue().get(0),
        (oldValue, newValue) -> newValue,
        TreeMap::new)));

这使用了 Collectors.toMap 的重载版本,它需要一个工厂用于地图。

【讨论】:

  • 您好 fps,非常感谢您!为了回答问题,我真的是一个java新手,因此使用了distinct()。再次感谢您!
  • @User distinct() 不需要,因为您正在流式传输地图,并且地图永远不会有重复的键。因此,您的最终地图中也不会有重复的键
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多