繁体   English   中英

使用 Comparator 对 Student 类型的 ArrayList 进行排序,使用选择排序(在这种情况下不能使用 Collections.sort 方法)

[英]Using a Comparator to sort an ArrayList of type Student, with selection sort (cannot use Collections.sort method in this case)

我非常坚持这个概念,似乎无法理解它。 我有一个学校的作业,我需要使用String nameString addressint rollno的值制作一个ArrayList<Student>

创建 ArrayList 并填充它根本不是问题。 我的问题是必须使用两个 Comparator 类和一个选择排序来按名称和 rollno 对 ArrayList 进行排序。 在这种情况下,我不能使用Collections.sort方法。

我被困在这里,非常感谢一些帮助。

谢谢!

排序程序

import java.util.*;

public class Sort {

    public Comparator<Student>sortByRoll;
    public Comparator<Student>sortByName;

    public static void main(String [] args) {

        // Declare ArrayList Student

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

        // Create Objects using Student Class

        Student s1 = new Student("John Smith", 1001, "101 Meadow Ave");
        Student s2 = new Student("William James", 2011, "1201 Joney Ave");
        Student s3 = new Student("Rocky Ferguson", 3003, "1011 Bleeker Street");
        Student s4 = new Student("Kitty Roberts", 9284, "906 Dog Ave");
        Student s5 = new Student("Lionel Doe", 2100, "221 Colorado Ave");
        Student s6 = new Student("Linus Jim", 5993, "26 Cass Ave");
        Student s7 = new Student("Haley Henry", 9019, "20001 Log Blvd");
        Student s8 = new Student("Penny Cone", 1009, "11 Cracked Court");
        Student s9 = new Student("John Shepherd", 1029, "2010 Gold Street");
        Student s10 = new Student("Joshua Old", 8463, "77 Railroad Street");

        // Adding Objects to ArrayList studentList

        studentList.add(s1);
        studentList.add(s2);
        studentList.add(s3);
        studentList.add(s4);
        studentList.add(s5);
        studentList.add(s6);
        studentList.add(s7);
        studentList.add(s8);
        studentList.add(s9);
        studentList.add(s10);

    }


}

学生.java

public class Student extends Sort {

    // Variables for this class

    public int rollno;
    public String name;
    public String address;
    public String student;

    // Constructor for creating a student

    Student(String name, int rollno, String address) {

        this.name = name;
        this.rollno = rollno;
        this.address = address;

    }

    //Getters for name, address, and number

    public String getName() {
        return name;
    }

    public String getAddress() {
        return address;
    }

    public int getRollNo() {
        return rollno;
    }
}

SortByName.java

import java.util.Comparator;

public class sortByName extends Sort implements Comparator<Student>{

        @Override
        public int compare(Student o1, Student o2) {

            // Help Plz

    };

sortByNum.java

import java.util.Comparator;

public class sortByNum extends Sort implements Comparator<Student> {


        @Override
        public int compare(Student o1, Student o2) {

            //Help plz
        }

    };
}

您不能使用Collections.sort(Comparator)因为,正如您所说,您的任务是实现选择排序。 我不会详细介绍算法(我想这是您的练习),但您可以在compare器中实现compare方法,如下所示:

对于卷号:

@Override
public int compare(Student o1, Student o2) {
    return Integer.compare(o1.getRollNo(), o2.getRollNo());
}

对于名称:

@Override
public int compare(Student o1, Student o2) {
    return o1.getName().compareTo(o2.getName());
}

有了这些比较器,您可以调用此compare(Student, Student)方法,以根据比较器获取一个学生是小于 (-1)、等于 (0) 还是大于 (1) 另一个学生。 这是您将用于比较选择排序算法中的 Student 对象的内容。

应要求编辑:排序方法本身可以放在您的主类Sort ,如下所示:

public void sortOnRollNo(List<Student> list) {
    // Sort the list here using the sortByRoll Comparator.
}
public void sortOnStudentName(List<Student> list) {
    // Sort the list here using the sortByName Comparator.
}

对于任何一个你compare方法,你只需要返回0,如果两个对象在排序顺序等同,-1,如果o1是“前” o2的排序顺序,或1如果o1 “后”是o2的排序顺序。

如果您纯粹是在名称上进行比较,您可以这样做:

@Override
public int compare(Student o1, Student o2) {
    return o1.getName().compareTo(o2.getName());
}

这使用字符串的内置比较。

或者,如果您想根据卷号进行比较:

@Override
public int compare(Student o1, Student o2) {
    if (o1.getRollNo() == o2.getRollNo()) {
        return 0;
    } else if (o1.getRollNo() < o2.getRollNo()) {
        return -1;
    } else {
        return 1;
    }
}

我意识到有更有效的方法可以做到这一点,但我试图弄清楚发生了什么。

您所要做的就是决定两个学生中的哪一个应该先来,如果是o1则返回 -1 ,如果是o2则返回 1 ,如果它们的排序顺序相同则返回 0 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM