根据分数JAVA比较学生

时间:2016-04-13 16:47:01

标签: java arraylist int comparator

我有一班学生。该课程有String nameint studentIdint studentScore。我想根据学生核心比较ArrayList<Student> students中的学生。这意味着如果“学生1”和“学生2”具有相同数量的学生核心,那么他们的两个等级将是相同的。我有一个功能,我设置排名。但我不确定如何比较arraylist中的所有内容。

当我搜索比较int值时,我得到结果:

How to properly compare two Integers in Java?

我认为最好的解决方案是使用比较器类功能。但我不确定如何做到这一点,因为我不确定比较器类的能力。我想到了循环获得一个玩家的循环,然后再循环和比较。但这似乎不是一个好的解决方案。

  

我想要这个结果:

假设学生数组包含(姓名,学生核心):

(kim, 12), (werder, 20), (ben, 32), (sara, 12)

我想要学生的等级(如果是ASC命令):

kim: rank = 1
werder: 2
ben: 3
sara: 1

4 个答案:

答案 0 :(得分:2)

您应该使用java Stream(Java 8)。 更好的方法来做到这一点。 您可以在http://www.leveluplunch.com/java/tutorials/007-sort-arraylist-stream-of-objects-in-java8/

找到一个非常好的例子

答案 1 :(得分:1)

您可以先使用Comparator.somparing()比较器对学生进行评分,然后迭代排序列表并应用排名,如下所示:

Collection<Student> students =  // ... your collection of students

// copy students to a new List
List<Student> ordered = new ArrayList<>(students);

// sort by score
Collections.sort(ordered, Comparator.comparing(Student::getScore));

// set rank 1 to first item, i. e. having the lowest score
int rank = 1;
ordered.get(0).setRank(rank);
for (int i = 1; i < ordered.size(); i++) {
    // increment rank only if score changed
    // in order to apply same ranks to same scores
    if (ordered.get(i).getScore() != ordered.get(i - 1).getScore())
        rank++;
    ordered.get(i).setRank(rank);
}

如果您需要将较低等级分配给较高分数,只需将.reversed()应用于比较器:

Collections.sort(ordered, Comparator.comparing(Student::getScore).reversed());

要在1.8之前的Java中创建比较器,您需要实例化实现Comparator方法的匿名.compare()

Comparator<Student> cmp = new Comparator<Student>() {
    @Override
    public int compare(Student s1, Student s2) {
        return s1.getScore().compareTo(s2.getScore());
    }
}

答案 2 :(得分:0)

如果我理解正确,您希望能够根据ArrayList<Student>studentScore进行排序。

您可以让学生班级实施Comparable()

public class Student implements Comparable<Student> {
    private String name;
    private int studentId;
    private int studentScore;

public int compareTo(Contact other) {
    return studentScore.compareTo(other.studentScore);
}

然后你可以做

ArrayList<Student> students = new ArrayList<Student>;
// Insert you students into the array
// students.add(someStudent)
Collections.sort(students);

请注意,这是Comparable接口,需要您实现方法compareTo()。如果要强加总排序,则只需要Comparator接口,例如订购没有自然排序的对象。

然后应该按照列表中的升序对学生进行排序,这样列表中的第一个元素就是&#34;最小的&#34;。

答案 3 :(得分:0)

有两种方法可以解决您的问题。您可以让您的类实现Comparable接口,然后它将有一个方法compareTo()。但是,您需要担心,equals()方法与equals()方法一致。这意味着您需要覆盖hashCode()int compare(T o1, T o2)方法。这可能有点太多了。

另一种方法是创建自己的Comparator,它将实现一个接口Comporator。您需要做的只是推荐方法Collections,然后只使用center-block的{​​{3}}方法。 一旦对数组进行排序,只需迭代它并分配适当的等级

即可