Java对象排序时相同值元素如何分配共享的序数后缀?
解决方案
不需要修改ordinal()方法,你只需要调整打印逻辑,识别连续分数相同的分组,为同一分组生成统一的区间排名前缀即可,具体实现思路和代码如下:
- 遍历已排序的客户列表时,先定位当前连续相同分数的区间起止位置
- 根据区间的起止位置计算对应的排名,区间长度为1时直接输出单个排名,长度大于1时输出区间排名
- 批量打印当前区间的所有客户信息后,跳到下一个不同分数的区间继续处理
示例代码
替换你原有的打印逻辑为以下代码即可实现预期效果:
int currentIndex = 0; int clientSize = sortedClients.size(); // 逐个处理每个分数分组 while (currentIndex < clientSize) { // 记录当前分组的起始排名、起始分数 int startRank = currentIndex + 1; double currentScore = sortedClients.get(currentIndex).getScore(); // 向后查找当前分组的结束索引 int endIndex = currentIndex; while (endIndex + 1 < clientSize // 浮点型分数建议用差值小于阈值判断相等,避免精度问题,精度要求不高也可以直接用== && Math.abs(sortedClients.get(endIndex + 1).getScore() - currentScore) < 1e-6) { endIndex++; } int endRank = endIndex + 1; // 生成排名前缀 String rankPrefix = startRank == endRank ? ordinal(startRank) : ordinal(startRank) + "-" + ordinal(endRank); // 打印当前分组所有客户 for (int i = currentIndex; i <= endIndex; i++) { System.out.println(rankPrefix + " " + sortedClients.get(i).getName() + " - " + sortedClients.get(i).getScore()); } // 跳转至下一分组 currentIndex = endIndex + 1; }
内容的提问来源于stack exchange,提问作者dennis
相关产品推荐
相关产品推荐

