Как отсортировать части ArrayList объектов класса? - PullRequest
0 голосов
/ 07 октября 2018

Я посмотрел на многие вопросы, которые были заданы, которые кажутся похожими, но ни один из них не решает полностью мою проблему.

У меня есть класс с именем Student, класс с именем RollManager и драйвер с именем RollDriver.Класс Student позволяет пользователю вводить данные для учащегося, такие как его имя, специализация, средний балл, классификация и т. Д.

В классе RollManager есть ArrayList с именем classRoll, который содержит объекты типа Student (выглядит следующим образом: ArrayList<Student> classRoll = new ArrayList<>();

В RollDriver есть меню, которое позволяет пользователю делать несколько вещей. Среди них мне нужно иметь возможность сортировать объекты Student по их именам, а также отдельную опцию, которая позволяет мне сортироватьих 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);
            }

Я не получаю никаких ошибок при запуске, но ничего не происходит. Объекты не сортируются по-другому.

Это некоторые из предварительных добавленийОбъекты ed, которые я добавил в classRoll для проверки моего кода (классификация - enum):

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 голосов
/ 08 октября 2018

Способ сделать это - использовать 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 петлями выше.

0 голосов
/ 08 октября 2018

Вы используете другой метод 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 поля (firstName и lastName), вы можете использовать thenComparing:

// Sort by last name, then first name
classRoll.sort(Comparator.comparing(Student::getLastName)
                         .thenComparing(Student::getFirstName));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...