【发布时间】:2019-02-19 22:29:25
【问题描述】:
我需要您的建议来简化下面的代码。我有一个玩家列表,其中包含获胜游戏的 ID。我想从这个列表中提取 2 个最好的球员(比赛 ID 数量较多的 2 个球员) 提取后,我必须返回初始列表以执行其他操作。 我认为可以在优化或阅读方面改进此代码。如果你能帮助我。
public class PlayerStatistics {
int id
String name;
int idMatchWon; // key from Match
// getter , setter
}
public static void main(String[] args) throws Exception {
List<PlayerStatistics> _players = new ArrayList<PlayerStatistics>();
_players.add(initialize(1,'John',4));
_players.add(initialize(2,'Teddy',2));
_players.add(initialize(3,'Kevin',3));
// How to get Top 2
List<PlayerStatistics> _top2Players = extractTop2Players(_players);
}
private List<PlayerStatistics> extractTop2Players (List<PlayerStatistics> _list) {
List<PlayerStatistics> _topPlayers = new ArrayList<PlayerStatistics>();
// 1. Group and count
Map<String, Long> _players = _list
.stream()
.filter(x -> (!"".equals(x.getName()) && x.getName()!= null) )
.collect(
Collectors.groupingBy(
PlayerStatistics::getName, Collectors.counting()
)
);
;
// 2 Best Palyers
Set<String> _sortedPlayers = _players.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
.limit(2)
.map(Entry::getKey)
.collect(Collectors.toSet())
;
// 3. Rebuild list
_topPlayers = _list
.stream()
.filter(x -> _sortedPlayers.contains(x.getName()))
.collect(Collectors.toList())
;
return _topPlayers;
}
private PlayerStatistics initialize (int id, String name, int year, int month, int won, int lost) {
return
new PlayerStatistics()
.withId(id)
.withName(name)
.withIdMatchWon(won)
);
}
【问题讨论】:
-
我会像你一样使用
.sorted()和.limit(2)。不过,我还没有研究过你所有的代码。 -
我会这样做的。
-
'John'等不是有效的 Java 语法。此外,您的任务还不清楚。您说,您想获得“玩家”,但实际上您正在收集PlayerStatistics,每个玩家可能不止一个。您似乎假设每个玩家都有一个唯一的名称,但您应该明确说明。特别是,因为名称是“玩家”的唯一实际概念。如果这就是您对某个玩家的全部了解,那么您的_sortedPlayers集已经是最终结果,即前 2 名“玩家”,所以不清楚为什么要执行第三步收集所有相关的PlayerStatistics。
标签: java sorting java-8 java-stream collect