【问题标题】:How to list numbers after sorting in java如何在java中排序后列出数字
【发布时间】:2013-09-01 11:42:01
【问题描述】:

我不熟悉使用 Collections 类。

我想按降序对一堆考试分数进行排序,比如(430,400,372,500),然后按优劣顺序显示数字 (System.out.println()),这样 500 分排在第 1 位,430 分排在第 2 位,依此类推。

我该怎么做?

【问题讨论】:

标签: java


【解决方案1】:

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

假设我们有一个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;
}

【讨论】:

  • 如果唯一的目的是向后打印,您总是可以向后循环而不是 reverse Collection。使用ListIterator 这很简单。
  • 非常感谢。如果两个或多个学生的分数相同……输出的数字会对应吗?例如(421,421,416,430)输出会是(1,2,2,4)吗?
  • 标记将按顺序放置,但“行”号仍会递增。它们仅用于展示目的
  • 我想在理想情况下,Collection 需要放入 Map 中,其中包含每个重复值的计数,以便输出可以是 1,3,3,4
【解决方案2】:

试试Collections.sortCollections.reverse

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

首先Collection.sort() 将安排发送顺序。并且使用Collection.reverse() 它会将所有列表值按降序排列。

【讨论】:

  • 这个答案已经提供并且更详细,你认为你的答案对这个问题有什么补充?
  • @BoristheSpider 如果你这样想,每个问题都只有一个答案。我试过并发布。所以需要一些时间
【解决方案3】:

你可以用这个

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

【讨论】:

  • 甚至,使用static 导入,new ArrayList&lt;Integer&gt;(asList(new int[]{430, 400, 372, 500}))!
  • 公平点,应该是Arrays.asList
  • @BoristheSpider 不!根据我的知识Collections stores Objects only 所以Arrays.asList 不适用于primitive data types,因为我在答案int MarksArr[] 中使用数组的原始数据类型
  • 你有什么算法可以用来确定标记中是否存在平局吗?
  • @Tarsem 是的,我认为应该是 new ArrayList&lt;Integer&gt;(asList(new Integer[]{430, 400, 372, 500}))(不要忘记 static 导入)
猜你喜欢
  • 2013-04-22
  • 2012-11-09
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多