我有一班学生。该课程有String name
,int studentId
和int 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
答案 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}}方法。
一旦对数组进行排序,只需迭代它并分配适当的等级