Существует несколько возможных способов достижения этого.
Предполагая, что мы имеем 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, вы можете также сделать обратные итерации списка, если все, что вы хотите сделать, это отобразить результат (спасибо Борису паука)
Collections.sort(marks);
int row = 0;
ListIterator li = a.listIterator(a.size());
while(li.hasPrevious()) {
System.out.println(li.previous());
}
Обновлено Wi го строения
Если вам интересно узнать «вес» на отметке, вам необходимо изменить маркер линии так, чтобы он только увеличивался, когда последний знак и следующий знак больше не равны ...
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;
}
Посмотрите отличный учебник Ларса Фогеля в [Java Collections ] (http://www.vogella.com/articles/JavaCollections/article.html#collectionssort). – Jost
проверить эту ссылку http://stackoverflow.com/questions/5894818/how-to-sort-arraylistlong-in-java-in-decreasing-order – dthien