Как добавить поле класса в сортировку?

175
11 июля 2018, 18:50

Есть класс User, в котором заданы 6 имен и 6 фамилий и который создает случайного человека со случайным именем, фамилией и возрастом. В нем реализован интерфейс Comparable который сортирует по фамилии, если они одинаковы то по имени, если они одинаковы то по возрасту. Создан список из 100 не повторяющихся User и отсортирован.

А также есть класс Student который наследуется от User и имеет поле группы с вариантами "java", "c++", "python", "qa", "desing", "frontend", и реализует интерфейс Comparable. Создан список из 100 не повторяющихся Student, и отсортирован.

Проблема состоит в том, что мне Student нужно отсортировать по полям группы, а потом уже по остальным полям (по фамилии, если они одинаковы то по имени, если они одинаковы то по возрасту), я не могу понять как добавить поле group в сортировку? Потому как при запуске кода, на консоль выводит сортировку без поля группы. Ниже привожу весь код для понимания общей картины.

public enum FirstName {
  IGOR(0),
  ALEXEY(1),
  DMITRIY(2),
  ANDREY(3),
  EVGENIY(4),
  NIKOLAY(5);
  int value;
  FirstName(int value) {
     this.value = value;
  }
}
public enum  SecondName {
  PETROV(0),
  IVANOV(1),
  SIDOROV(2),
  PETRENKO(3),
  EGOROV(4),
  RUDKOVSKIY(5);
  int value;
  SecondName(int value) {
    this.value = value;
  }
}
public class User implements Comparable<User> {
  private FirstName firstName;
  private SecondName secondName;
  private int age;
  private static Random random = new Random();
  public User() {
    this.firstName = firstName.values()[random.nextInt(FirstName.values().length)];
    this.secondName = secondName.values()[random.nextInt(SecondName.values().length)];
    this.age = random.nextInt(15) + 30;
  }
  @Override
  public int compareTo(User user) {
    int result = Integer.compare(secondName.value, user.secondName.value);
    if (result == 0) {
        result = Integer.compare(firstName.value, user.firstName.value);
    }
    if (result == 0) {
        result = Integer.compare(age, user.age);
    }
    return result;
  }
}
public class Student extends User {
    private enum Group {
      JAVA(0),
      C(1),
      PYTHON(2),
      QA(3),
      DESIGN(4),
      FRONTEND(5);
      int value;
      Group(int value) {
        this.value = value;
      }
    }
    private Group group;
    private static Random random = new Random();
    public Student() {
      this.group = Group.values()[random.nextInt(Group.values().length)];
    }

    public int compareTo(User user) {
      int result = 0;
      if (user instanceof Student) {
        Student student = (Student) user;
        result = group.compareTo(student.group);
      }
      if (result == 0) {
        return super.compareTo(user);
      } else {
        return result;
      }
}
public class Main {
  public static void main(String[] args) {
    List<User> users = new ArrayList<>();
    int size = 100;
    while (users.size() < size) {
        User user = new User();
        if (!users.contains(user)) {
            users.add(user);
        }
    }
    System.out.println("List of 100 non-repeating `User`:");
    System.out.println(" ");
    users.forEach(System.out::println);
    Collections.sort(users);
    System.out.println("====================================");
    System.out.println(" ");
    System.out.println("Sorted list `User`:");
    System.out.println(" ");
    users.forEach(System.out::println);
    System.out.println(" ");
    List<Student> students = new ArrayList<>();
    while (students.size() < size) {
        Student student = new Student();
        if (!students.contains(student)) {
            students.add(student);
        }
    }
    System.out.println("List of 100 non-repeating `Student`:");
    System.out.println(" ");
    users.forEach(System.out::println);
    Collections.sort(students);
    System.out.println("====================================");
    System.out.println(" ");
    System.out.println("Sorted list `Student`:");
    System.out.println(" ");
    users.forEach(System.out::println);
  }
}
Answer 1

Ошибка копипаста. Вы заполняете и сортируете список студентов, а выводите список юзеров

System.out.println("List of 100 non-repeating `Student`:");
System.out.println(" ");
// users.forEach(System.out::println);
// ^^^^^  Ошибка!!!
students.forEach(System.out::println);
Collections.sort(students);
System.out.println("====================================");
System.out.println(" ");
System.out.println("Sorted list `Student`:");
System.out.println(" ");
// users.forEach(System.out::println);
// ^^^^^  Ошибка!!!
students.forEach(System.out::println);
READ ALSO
Как массив разделить на два ряда?

Как массив разделить на два ряда?

интересует вопрос, каким образом можно массив разделить на два ряда в конечном отображении? На данный момент массив отображается одним рядом

186
Добавить данные в одно поле в Cloud Firestore в Android Studio

Добавить данные в одно поле в Cloud Firestore в Android Studio

Я новичок в андроид разработкеУ меня вопрос

186
Из Java FX в Maven

Из Java FX в Maven

Требуется собрать приложениеПри создании проекта выбирал java fx

136
Java 8, Stream API, Generics что я упустил?

Java 8, Stream API, Generics что я упустил?

Что я упустил в дженериках? Эта конструкция валидна, но убирая дженерик у стрима Stream stream = liststream(); уже не валидна?

160