【发布时间】:2021-10-18 00:34:51
【问题描述】:
有运动员的总分。我想按总分对列表进行排序,并将位置(地点)添加到position 字段。
在相同分数的情况下,运动员必须共享名额,例如3-4 和 3-4 而不是 3 和 4。
input date:
- ABC 10,
- BBC 8,
- CBC 11,
- ACD 8
expected output:
pos, name, score
- 1, CBC, 11
- 2, ABC, 10
- 3-4, BBC, 8
- 3-4, ACD, 8
我的解决方案看起来有点复杂,有没有更好的方法?
class Athlete {
private String name;
private Long totalScore;
private String position;
}
List<Athlete> athletes = new ArrayList()<>;
...
int i = 0;
int rank = 0;
long score = Integer.MIN_VALUE;
Map<Integer, Integer> rankings = new HashMap<>();
for (Athlete athlete : athletes) {
++i;
if (score != athlete.getTotalScore()) {
rank = i;
rankings.put(rank, 1);
} else {
rankings.put(rank, rankings.get(rank) + 1);
}
athlete.setRank(rank + "");
score = athlete.getTotalScore();
}
rankings.entrySet()
.stream().filter(entry -> entry.getValue() > 1)
.forEach(entry -> {
int pos = entry.getKey() - 1;
String cRank = entry.getKey() + "-" + (pos + entry.getValue());
IntStream.range(pos, pos + entry.getValue())
.forEach(p -> athletes.get(p).setRank(cRank));
});
什么
【问题讨论】:
-
您的解决方案真的有效吗?如果是这样,您对解决方案的特别关注是什么?如果解决方案有效,那么这可能不是您的问题的最佳位置,因为它可能更适合Stack Exchange Code Review 站点。请注意,我说“可能”会更好,因为他们对哪些问题最合适有自己的规则和规定,检查他们的help 链接是明智的。
-
@HovercraftFullOfEels 是的,它有效。我不是要改进我的解决方案。我想知道是否还有其他更好的解决方案。