【问题标题】:pick keys with equal values and create a new list from them选择具有相同值的键并从中创建一个新列表
【发布时间】:2022-09-30 22:40:19
【问题描述】:

我有以下地图:

public Map<Player, Integer> results = new LinkedHashMap<>();

我想在结果图中创建一个具有相同整数值(highestScore)的新玩家列表。

我计算highestScore - 工作正常:

Optional<Integer> highestScore = scoreResultsSorted.entrySet().stream().map(Map.Entry::getValue).findFirst();

我初始化了public List&lt;Player&gt; tiePlayers = new ArrayList&lt;&gt;();

我的方法是:

1)

    for (Map.Entry<Player, Integer> entry : results.entrySet()) {
        if (entry.getValue().equals(highestScore)) {
            tiePlayers.add(entry.getKey());
        }
    }
  1. tiePlayers = (List&lt;Player&gt;) results.entrySet().stream().filter(entry -&gt; entry.getValue().equals(highestScore)).map(Map.Entry::getKey);

第一个返回空数组 [],第二个返回 \"java.lang.ClassCastException: class java.util.stream.ReferencePipeline$3 cannot be cast to class java.util.List (java.util.stream.ReferencePipeline$3 and java.util.List 位于加载器\'bootstrap\')\" 的模块 java.base 中。

第二个例外我真的没有得到。在第一个我找不到它空的原因。

    标签: java


    【解决方案1】:

    您需要从Optional 中获取值来比较它。

    因此,第一个解决方案应该是:

    if (entry.getValue().equals(highestScore.get()))
    

    这同样适用于带有流的解决方案。另外,不要投到List;你应该使用Collectors.toList()

    results.entrySet().stream().filter(entry -> entry.getValue().equals(highestScore.get()))
        .map(Map.Entry::getKey).collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多