- 此问题在此处已有答案**:
Convert List to Map<String, Integer>(4个答案)
1年前关闭。
我有以下球队名单和他们的得分:
List<String> teams = Arrays.asList("Dortmund 8", "Bayern 10", "Madrid 9", "Bayern 2", "Dortmund 4");
我需要输出得分最高的球队。如果得分相等,则输出得分最高的球队。在我的示例中,多特蒙德和拜仁得分相等,但拜仁得分最高。因此输出的是拜仁。下面是我现在的输出:
Map<String, Integer> map = new HashMap<>();
for (String s : teams) {
String[] rec = s.split(" ");
int val = Integer.parseInt(rec[1]);
map.put(rec[0], map.get(rec[0])==null ? val : map.get(rec[0]) + val);
}
System.out.println(map);
代码只是将每个团队的分数相加并保存在Map上。我不能改变我需要的方式。
3条答案
按热度按时间zdwk9cvp1#
这个名单的冠军不是多特蒙德,而是拜仁。
两队的最高分相同:22.拜仁获胜,因为它首先达到最高分。
sum>max
而不是sum>=max
**,就可以保证第一个达到最高分的队伍获胜。测试,工作:
8ehkhllq2#
使用Stream API、Regex(参见Regex101上的演示)以及
Pattern
和Matcher
类有一种简单的方法。记住在Java中正则表达式必须进行双转义(
\d
-〉\\d
):Matcher
的优点是它可以保存原始字符串(group()
)和捕获的组(group(int)
)。调用Matcher#find
后,您可以使用捕获的组。获取编号所在的组,并将其用于groupingBy
收集器下游的求和,以获得Map<String, Integer>
,其中组名作为键,其总和为Map供应商LinkedHashMap::new
确保有序Map。随后的
Collectors.collectingAndThen
获取条目并找到具有最高得分的条目。只要处理准备好在输入列表为空的情况下返回空Optional
,则整个流得到Optional<String>
。**一个重要的注意事项:**考虑为这样的构造使用一个类(带有
String name
和int score
)。进一步的操作会更容易。dced5bon3#
基于流的解决方案应使用
Collectors.groupingBy
和Collectors.summingInt
计算Map中的总目标/点,然后从其条目中获取最大值:输出:
然而,这种解决方案并不保证最早进球最多的球队将被选为获胜者。
对于
List<String> teams = Arrays.asList("AEK 8", "Bayern 10", "Madrid 9", "Bayern 2", "AEK 4");
,结果为AEK
。类似的基于循环的版本可以使用
Map::merge
来计算目标/点的总值:输出: