如何对一个类的对象的ArrayList部分进行排序?

时间:2018-10-07 20:58:01

标签: java arrays sorting arraylist selection-sort

我查看了许多看起来相似的问题,但没有一个能完全解决我的问题。

我有一个名为Student的类,一个名为RollManager的类和一个名为RollDriver的驱动程序。学生类允许用户输入学生的数据,例如他们的姓名,专业,GPA,分类等。

RollManager类具有一个名为classRoll的ArrayList,该列表包含Student类型的对象(如下所示:ArrayList<Student> classRoll = new ArrayList<>();

在RollDriver中是一个菜单,允许用户执行多项操作。其中,我需要能够按学生对象的名称对它们进行排序,并且需要一个单独的选项,该选项可以让我按其GPA对其进行排序。

问题是,当我尝试使用Collections.sort(classRoll)时,它不知道如何对它们进行排序。因此,我在RollManager类中创建了一个名为sortName的方法,但是如何指定要根据Student对象的“名称”值进行特定排序的方法?这是我的一些代码:

RollManager:

public static void sortName(ArrayList<Student> classRoll)
    {
        for(int i = 0; i < classRoll.size(); i++)
        {
            int pos = i;
            for(int n = i; n < classRoll.size(); n++)
            {
                if(classRoll.get(n).equals(classRoll.get(pos)))
                {
                    pos = n;
                }
            }
        }
    }

RollDriver中的选项进行排序:

else if(choice == 8)
            {
                RollManager.sortName(classRoll);
                System.out.println (classRoll);
            }

运行此程序时,我没有收到任何错误,但也没有任何反应。这些对象的排序没有任何不同。

这些是我添加到classRoll中的一些预添加对象,以测试我的代码(分类是一个枚举):

Student student2 = new Student("John", "Doe", "COMM", 120, 3.65, Classification.FRESHMAN);
Student student3 = new Student("Bob", "Ross", "ARTS", 200, 3.99, Classification.OTHER);
Student student4 = new Student("Liev", "Schreiber", "FILM", 100, 2.53, Classification.GRADUATE);
Student student5 = new Student("Maury", "Povich", "PSCI", 75, 2.24, Classification.JUNIOR);
Student student6 = new Student("Bill", "Leidermann", "CSCI", 90, 2.95, Classification.SENIOR);

classRoll.add (student2);
classRoll.add (student3);
classRoll.add (student4);
classRoll.add (student5);
classRoll.add (student6);

我希望这是足够的信息。如有必要,我可以发布更多代码。谢谢您的协助!

2 个答案:

答案 0 :(得分:2)

您使用其他Collections.sort方法:sort(List<T> list, Comparator<? super T> c)

您可以这样使用它:

Collections.sort(classRoll, new Comparator<Student>() {
    @Override
    public int compare(Student s1, Student s2) {
        return s1.getName().compareTo(s2.getName());
    }
});

在Java 8+中,它甚至更容易:

// Sort by name
classRoll.sort(Comparator.comparing(Student::getName));

// Sort by GPA
classRoll.sort(Comparator.comparingDouble(Student::getGpa));

如果名称是2个字段(firstNamelastName),则可以使用thenComparing

// Sort by last name, then first name
classRoll.sort(Comparator.comparing(Student::getLastName)
                         .thenComparing(Student::getFirstName));

答案 1 :(得分:0)

方法是将Collections.sort与自定义比较器一起使用:

Comparator<Student> nameComparator = new Comparator<Student>() {
     public int compare(Student student1, Student student2) {
        return student1.getName().compareTo(student2.getName());
     }
  };

Comparator<Student> gpaComparator = new Comparator<Student>() {
     public int compare(Student student1, Student student2) {
        return student1.getGPA().compareTo(student2.getGPA());
     }
  };

然后,您可以根据需要使用不同的比较器:

Collections.sort(classRoll, nameComparator);

与上面具有2个循环的解决方案相比,这样您就可以优化分选器。