Java 比较器未正确比较值
我有一个比较器,它将每个受试者的分数与总体分数进行比较,并从最高到最低进行排序。唯一的问题是主题列表绑定在学生对象中。所以每个学生都有很多科目。总分为双字。比较器工作不正常Java 比较器未正确比较值,java,list,comparator,Java,List,Comparator,我有一个比较器,它将每个受试者的分数与总体分数进行比较,并从最高到最低进行排序。唯一的问题是主题列表绑定在学生对象中。所以每个学生都有很多科目。总分为双字。比较器工作不正常 public class RankComparator implements Comparator<Subject> { @Override public int compare(Subject s1, Subject s2) { if (s1.geto
public class RankComparator implements Comparator<Subject> {
@Override
public int compare(Subject s1, Subject s2) {
if (s1.getoveralMark() < s2.getoveralMark())
return -1;
if (s1.getoveralMark() > s2.getoveralMark())
return 1;
return 0;
}
}
公共类RankComparator实现Comparator{
@凌驾
公共整数比较(受试者s1、受试者s2){
if(s1.getoveralMark()s2.getoveralMark())
返回1;
返回0;
}
}
更新:我已经添加了以下代码,但它仍然没有按照最高的总体分数对主题进行排序
for (Student student : studentList) {
// if (subj.subjectName.contains("English")) {
for (Subject subj : student.subject) {
Collections.sort(student.subject, new RankComparator());
System.out.println(subj.overalMark);
}
Collections.sort(studentList, compareByAllSubjects());
for (Student student : studentList) {
System.out.println(student.firstName);
for (Subject subk : student.subject) {
System.out.println(subk.subjectName);
System.out.println(subk.overalMark);
}
}
// }
}
private static Comparator<Student> compareBySubject(final int index) {
return new Comparator<Student>() {
@Override
public int compare(Student student0, Student student1) {
Subject subject0 = student0.subject.get(index);
Subject subject1 = student1.subject.get(index);
if (subject0.getSubjectName() == subject1.getSubjectName()) {
double mark0 = subject0.getoveralMark();
double mark1 = subject1.getoveralMark();
return Double.compare(mark0, mark1);
}
return 0;
}
};
}
private static double computeMaxMark(List<Subject> subjects) {
double max = -Double.MAX_VALUE;
for (Subject subject : subjects) {
max = Math.max(max, subject.getoveralMark());
}
return max;
}
private static Comparator<Student> compareByAllSubjects() {
return new Comparator<Student>() {
@Override
public int compare(Student student0, Student student1) {
double mark0 = computeMaxMark(student0.getSubject());
double mark1 = computeMaxMark(student1.getSubject());
return Double.compare(mark0, mark1);
}
};
}
for(学生:学生列表){
//if(subject.subjectName.contains(“英语”)){
for(主题主题:学生主题){
Collections.sort(student.subject,new RankComparator());
系统输出打印LN(主题总标);
}
排序(studentList,compareByAllSubjects());
用于(学生:学生名单){
System.out.println(学生名);
for(科目编号:student.subk){
System.out.println(子k.subjectName);
系统输出打印LN(子k.总体标记);
}
}
// }
}
专用静态比较器compareBySubject(最终int索引){
返回新的比较器(){
@凌驾
公共整数比较(学生0,学生1){
Subject subject0=student0.Subject.get(索引);
Subject Subject 1=student1.Subject.get(索引);
if(subject0.getSubjectName()==subject1.getSubjectName()){
双标记0=subject0.getoveralMark();
双标记1=subject1.getoveralMark();
返回Double.compare(mark0,mark1);
}
返回0;
}
};
}
专用静态双计算机MaxMark(列出主题){
double max=-double.max_值;
用于(主题:主题){
max=Math.max(max,subject.getoveralMark());
}
返回最大值;
}
专用静态比较器compareByAllSubjects(){
返回新的比较器(){
@凌驾
公共整数比较(学生0,学生1){
double mark0=computeMaxMark(student0.getSubject());
double mark1=computeMaxMark(student1.getSubject());
返回Double.compare(mark0,mark1);
}
};
}
因此,根据评论,您希望根据学生在一门学科中取得的分数对学生进行排序。在这种情况下,您不需要一个比较器
,而是一个比较器
——即一个比较学生的比较器
然而,这个比较者必须“知道”学生应该根据哪个科目进行比较。在这种情况下,可能需要知道是否所有学生都有相同的科目,或者每个学生的科目集是否不同。如果它们可能不同,我们必须考虑排序应该如何处理没有主题的学生,根据该主题对学生进行排序
然而,创建比较器的一般方法根据学生在特定科目中取得的分数对学生进行排序,如本例所示:
(编辑:添加了另一个排序标准,这似乎是一个猜测游戏……)
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.List;
导入java.util.Random;
公共班级学生分类
{
公共静态void main(字符串[]args)
{
随机数=新随机数(0);
List students=new ArrayList();
对于(int i=0;这比较器不起作用。-你也可以发布你的愿望吗?它是如何起作用的?@Adam Arold例如,你有45.6,50,52.3,75.3的值,它将按以下方式对它进行排序:75.3,75.3,52.3,52.3为什么你要迭代主题列表来对它进行排序?这完全没有必要。如果你需要为其他对象迭代它gs,首先对其进行排序,然后在已排序的集合上迭代。@AnthonyGrist因为每个学生都包含一个主题列表。我需要对每个学生的总分最高的学生进行排序subject@user3423698这就是代码所做的。您的问题缺乏精确性令人不安。但是,我添加了另一个排序标准(并更新了答案中的代码)。如果这不是您想要的,请提供您想要的示例want@user3423698我放弃了。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
public class StudentSorting
{
public static void main(String[] args)
{
Random random = new Random(0);
List<Student> students = new ArrayList<Student>();
for (int i=0; i<3; i++)
{
Student student = new Student("Student"+i);
student.addSubject(new Subject("A", random.nextInt(6)));
student.addSubject(new Subject("B", random.nextInt(6)));
student.addSubject(new Subject("C", random.nextInt(6)));
students.add(student);
}
for (int s=0; s<3; s++)
{
System.out.println("Students compared by subject "+s);
Collections.sort(students, compareBySubject(s));
for (Student student : students)
{
System.out.println(" "+student);
}
}
System.out.println("Students compared all subjects");
Collections.sort(students, compareByAllSubjects());
for (Student student : students)
{
System.out.println(" "+student);
}
}
/**
* Creates a comparator that compares students by the overall mark
* that they achieved in the subject with the given index
*
* @param index The index of the subject
* @return The comparator
*/
private static Comparator<Student> compareBySubject(final int index)
{
return new Comparator<Student>()
{
@Override
public int compare(Student student0, Student student1)
{
Subject subject0 = student0.getSubject(index);
Subject subject1 = student1.getSubject(index);
double mark0 = subject0.getOverallMark();
double mark1 = subject1.getOverallMark();
return Double.compare(mark0, mark1);
}
};
}
/**
* Creates a comparator that compares students by the overall mark
* that they achieved in any subject
*
* @return The comparator
*/
private static Comparator<Student> compareByAllSubjects()
{
return new Comparator<Student>()
{
@Override
public int compare(Student student0, Student student1)
{
double mark0 = computeMaxMark(student0.getSubjects());
double mark1 = computeMaxMark(student1.getSubjects());
return Double.compare(mark0, mark1);
}
};
}
/**
* Computes the maximum overall mark of the given subjects
*
* @param subjects The subjects
* @return THe maximum mark
*/
private static double computeMaxMark(List<Subject> subjects)
{
double max = -Double.MAX_VALUE;
for (Subject subject : subjects)
{
max = Math.max(max, subject.getOverallMark());
}
return max;
}
}
class Subject
{
private final String name;
private final double mark;
Subject(String name, double mark)
{
this.name = name;
this.mark = mark;
}
double getOverallMark()
{
return mark;
}
@Override
public String toString()
{
return name+"("+mark+")";
}
}
class Student
{
private final String name;
private final List<Subject> subjects;
Student(String name)
{
this.name = name;
this.subjects = new ArrayList<Subject>();
}
void addSubject(Subject subject)
{
subjects.add(subject);
}
Subject getSubject(int index)
{
return subjects.get(index);
}
List<Subject> getSubjects()
{
return subjects;
}
@Override
public String toString()
{
return name+" with "+subjects;
}
}