您可以通过多种方式实现这一目标。
假设我们有一个List 如下...
List<Integer> marks = new ArrayList<>(5);
marks.add(430);
marks.add(400);
marks.add(372);
marks.add(500);
你可以简单地做...
Collections.sort(marks);
int row = 0;
for (Integer mark : marks) {
System.out.println((++row) + ": " + mark);
}
这将输出...
1: 372
2: 400
3: 430
4: 500
但是等等,这不是我们想要的!
但是通过排序列表,我们可以做到……
Collections.reverse(marks);
row = 0;
for (Integer mark : marks) {
System.out.println((++row) + ": " + mark);
}
哪些输出...
1: 500
2: 430
3: 400
4: 372
好多了:D
现在,如果这看起来工作量很大,您还可以使用 Comparator 来更改项目的排序方式...
Collections.sort(marks, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return (o2 - o1);
}
});
这将按以下顺序生成列表...
1: 500
2: 430
3: 400
4: 372
更新
根据Iterating through a list in reverse order in java 的回答,如果您只想显示结果(感谢 Boris the Spider),您还可以对列表进行反向迭代
Collections.sort(marks);
int row = 0;
ListIterator li = a.listIterator(a.size());
while(li.hasPrevious()) {
System.out.println(li.previous());
}
更新了线宽
如果您有兴趣了解标记上的“重量”,则需要修改线标记,使其仅在最后一个标记和下一个标记不再相等时增加...
List<Integer> marks = new ArrayList<>(Arrays.asList(new Integer[]{430, 400, 372, 400, 500}));
Collections.sort(marks, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return (o2 - o1);
}
});
int row = 0;
int last = -1;
for (Integer mark : marks) {
if (mark != last) {
row++;
}
System.out.println(row + ": " + mark);
last = mark;
}
哪些输出...
1: 500
2: 430
3: 400
3: 400
4: 372
现在,如果您希望输出更像...
1: 500
2: 430
3: 400
3: 400
5: 372 // Not the skipped line...
您需要知道单个标记匹配了多少次并相应地增加“行”...
int row = 0;
int last = -1;
int matches = 1;
for (Integer mark : marks) {
if (mark != last) {
row += matches;
matches = 1;
} else {
matches++;
}
System.out.println(row + ": " + mark);
last = mark;
}