1

我是使用该Collections课程的新手。

我想按降序对一堆考试分数进行排序,假设(430,400,372,500)然后System.out.println()按优点顺序显示数字(),这样 500 分获得第 1 位,430 分获得第 2 位等。

我怎么做?

4

3 回答 3

11

您可以通过多种方式实现这一目标。

假设我们有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

现在,如果这看起来工作量很大,您还可以使用 aComparator来更改项目的排序方式...

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;
}
于 2013-08-29T07:03:26.560 回答
0

Try Collections.sort, Collections.reverse

Collections.sort(sampleList);
Collections.reverse(sampleList);

First Collection.sort() will arrange the assending order. And the use the Collection.reverse() it will arrage all the list values into decending order.

于 2013-08-29T07:06:25.023 回答
0

只需您可以使用它

我假设你有array(int type) of marks

int MarksArr[] = { 421,421,416,430 }; // Array of your All Marks

        List<Integer> marks = new ArrayList<Integer>();
        for (int i = 0; i < MarksArr.length; i++)
            marks.add(MarksArr[i]);

        Collections.sort(marks);// this Will Sort in Acceding order 
        Collections.reverse(marks);// this will reverse the ArrayList (Descending order) 

  // Will Also Handle the Tie Case as per Your Comment o/p for position should be 1,2,2,4
   for (int i = 0; i < marks.size(); i++) {
        int pos = -1;
        if (i != 0)
            if (marks.get(i - 1).equals(marks.get(i)))
                pos = i;
            else
                pos = i+1;

        else {
            pos = i + 1;
        }

        System.out.println("Pos :" + pos + " Marks:" + marks.get(i));
    }

输出:

Pos :1 Marks:430
Pos :2 Marks:421
Pos :2 Marks:421
Pos :4 Marks:416
于 2013-08-29T07:12:14.343 回答