根据总值对对象数组列表进行排序

Posted

技术标签:

【中文标题】根据总值对对象数组列表进行排序【英文标题】:Sort object array list based on total value 【发布时间】:2013-12-01 18:23:12 【问题描述】:

我计算每个学生的总分。然后我将这些对象添加到数组列表中。我想要做的是基于这个总分(不是学生对象的属性),对我的数组列表进行排序并用总分显示学生详细信息。我不知道该怎么做。有人可以建议我一个很好的优化我来完成这项工作吗??

public static void TotalModuleMarkAboveAvg()
        double totalModuleMarkAvg = OverallClassAverage(false); //getting the avg of the total marks
        ArrayList<Student> students = new ArrayList<Student>();
        double studentTotalModuleMark = 0.0;
        student = new Student();
        System.out.println("List of students whose total module marks fall below the class average ");
        for(int i=0; i<MAX_STUDENT; i++)
            Student student = vector.get(i);
            studentTotalModuleMark = student.getCoursework1()*20/100;
            studentTotalModuleMark += student.getCoursework2()*20/100;
            studentTotalModuleMark += student.getFinalExam()*60/100;
            if(studentTotalModuleMark > totalModuleMarkAvg)
                students.add(student);
            
     // here I want to sort my array list based on the studentTotalModuleMark and display student registration number and total module mark
        

    

学生班

public class Student implements java.io.Serializable
    private int registrationNumber;
    private int coursework1;
    private int coursework2;
    private int finalExam;

    public int getRegistrationNumber() 
        return registrationNumber;
    
    public void setRegistrationNumber(int registrationNumber) 
        this.registrationNumber = registrationNumber;
    
    public int getCoursework1() 
        return coursework1;
    
    public void setCoursework1(int coursework1) 
        this.coursework1 = coursework1;
    
    public int getCoursework2() 
        return coursework2;
    
    public void setCoursework2(int coursework2) 
        this.coursework2 = coursework2;
    
    public int getFinalExam() 
        return finalExam;
    
    public void setFinalExam(int finalExam) 
        this.finalExam = finalExam;
       

【问题讨论】:

如果没有总数作为字段,排序将是一个真正令人头疼的问题。您需要一个相应的数组来保存总数。在手动对 Arraylist 进行排序时,对相应的数组索引进行排序。为什么不将总数作为一个字段? 另外,我感觉您希望将 ArrayList 放在方法之外。更有意义。 为什么你的方法中有两个学生变量。不好的做法。 是的,因为总可以导出运行时间,以为我不需要它作为字段。我可以改变每个模块运行时的权重。但似乎除了将总计添加为字段之外,我别无选择。 你不需要它,但你真的想要它。如果你有它作为一个字段,你可以使用神奇的Collections.sort() 技巧。只需要让您的方法实现可比较。我会提出一个答案,但要告诉你 【参考方案1】:
public class Student implements Comparable<Student>, Serializable 
    private int registrationNumber;
    private int coursework1;
    private int coursework2;
    private int finalExam;
    private int totalScore;

    public Student(int registrationNumber, int coursework1, 
                             int coursework2, int finalExam) 
        this.registrationNumber = registrationNumber;
        this.coursework1 = coursework1;
        this.coursework2 = coursework2;
        this.finalExam = finalExam;
        totalScore = coursework1 + coursework2 + finalExam;
    

    ...
    // all you getters and setters
    ...



    public int compareTo(Student s)
        if (this.totalScore > s.totalScore)
            return 1;
        else if (this.totalScore == s.totalScore)
            return 0;
        else 
            return -1;
    

现在一切都设置好了,您可以使用Collections.sort() 方法

ArrayList<Student> students = new ArrayList<Student>();

Student student1 = new Student(1, 90, 70, 100);
Student student1 = new Student(2, 85, 43, 90);
Student student1 = new Student(3, 67, 70, 80);

students.add(student1);
students.add(student2);
students.add(student3);

Collections.sort(students);
// Magic!

编辑:使用匿名比较器

public class ComparatorPractice
    public static void main(String[] args)
        ArrayList<Student> students = new ArrayList<Student>();

        Student student1 = new Student(1, 90, 70, 100);
        Student student1 = new Student(2, 85, 43, 90);
        Student student1 = new Student(3, 67, 70, 80);

        students.add(student1);
        students.add(student2);
        students.add(student3);

       Collections.sort(students, new Comparator()
           @Override
           public int compare(Object o1, Object o2)
               if (o1 instanceof Student && o2 instanceof Student)
                   if (o1.coursework1 > o2.coursework1)
                       return 1;
                   else if (o1.coursework1 == o2.coursework1)
                       return 0;
                   else
                        return -1;
               
           
       );

       System.out.println("Highest coursework1 mark is " 
                           + students.get(students.size()- 1).coursework1);

       Collections.sort(students, new Comparator()
           @Override
           public int compare(Object o1, Object o2)
               if (o1 instanceof Student && o2 instanceof Student)
                   if (o1.coursework2 > o2.coursework2)
                       return 1;
                   else if (o1.coursework2 == o2.coursework2)
                       return 0;
                   else
                        return -1;
               
           
       );

       System.out.println("Highest coursework2 mark is " 
                           + students.get(students.size()- 1).coursework2);
    

只需对要排序的每个组件执行相同操作即可。如果你这样做,不使用Comparable,你的Student 类中就不需要compareTo()implements Comparable

【讨论】:

意义重大.. 非常感谢 我不确定您希望如何计算 totalScore,因此请自行计算。 是的,这已经足够了!! 其他问题.. 我可以使用多个“compareTo”对我的 ArrayList 进行多次排序吗?我有点困惑。 您可以对每个组件使用比较器排序。但是请记住,一旦对它进行排序,然后使用不同的比较器对其进行排序,则无法再获得先前的排序。因此,在一个排序之后,您可能想要执行所有操作,然后为不同的组件完成另一个排序。请参阅我的编辑。它对我的课堂作业进行排序1。你不能对所有其他组件做同样的事情。只需将 classwork 切换为其他内容即可。

以上是关于根据总值对对象数组列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何根据GPA对数组列表进行升序排序? arraylist 包含一个对象数组。 (Java)[重复]

如何根据另一个数组的顺序对对象数组进行排序?

如何使用以下代码根据实例变量对对象数组进行升序排序

如何根据布尔属性对对象数组进行排序?

js对象数组按照另一个数组排序

编写一个函数对对象数组进行排序(通过使用另一个对象来指定排序路径和顺序)