Возврат SortedSet

Когда я запускаю следующий код:

  Student student1 = new Student("Billy", 13);
  Student student2 = new Student("Bob", 12);
  Student student3 = new Student("Belle", 11);
  Student student4 = new Student("Barry", 10);
  Student student5 = new Student("Brian", 10);
  Student student6 = new Student("Bane", 13);
  Collection<Student> students = new HashSet<Student>();
  students.add(student1);
  students.add(student2);
  students.add(student3);
  students.add(student4);
  students.add(student5);
  students.add(student6);
  for(Student student : students)
  {
    String name = student.getName();
    System.out.println(name);
  }

Он распечатает список имен для моих студенческих объектов. Теперь я хотел бы сделать их в алфавитном порядке. Я думал, что это будет так же просто, как использовать TreeSet или SortedSet.

Так:

 Student student1 = new Student("Billy", 13);
 Student student2 = new Student("Bob", 12);
 Student student3 = new Student("Belle", 11);
 Student student4 = new Student("Barry", 10);
 Student student5 = new Student("Brian", 10);
 Student student6 = new Student("Bane", 13);
 Collection<Student> students = **new TreeSet<Student>();**
 students.add(student1);
 students.add(student2);
 students.add(student3);
 students.add(student4);
 students.add(student5);
 students.add(student6);
 for(Student student : students)
 {
    String name = student.getName();
    System.out.println(name);
 }

Но это просто вызывает исключение:

  Exception in thread "main" java.lang.ClassCastException: helloworld.Student cannot be cast to java.lang.Comparable
    at java.util.TreeMap.put(TreeMap.java:542)
    at java.util.TreeSet.add(TreeSet.java:238)
    at helloworld.Main.main(Main.java:60)

Java Результат: 1

Я также добавил метод compareTo в студенческий класс:

 public int compareTo(Student other)
 {
   return this.getName().compareTo(other.getName());
 }

person Khal    schedule 27.01.2015    source источник
comment
Всегда, всегда, всегда публикуйте исключение (или ошибку времени компиляции), когда ваш вопрос связан с ней. Я предполагаю, что Student не реализует Comparable, но мы не можем сказать, так как у нас нет ни исключения, ни класса Student...   -  person Jon Skeet    schedule 27.01.2015
comment
Вы не читаете javadoc TreeSet. В нем говорится: Элементы упорядочиваются в соответствии с их естественным порядком или компаратором, предоставленным во время создания набора, в зависимости от того, какой конструктор используется. Часть естественный порядок ссылается на Comparable, который не реализован в вашем классе. И вы не предоставили компаратор. Как TreeSet может сравнивать несопоставимые элементы?   -  person JB Nizet    schedule 27.01.2015
comment
Исключение в потоке main java.lang.ClassCastException: helloworld.Student не может быть приведен к java.lang.Comparable в java.util.TreeMap.put(TreeMap.java:542) в java.util.TreeSet.add(TreeSet.java: 238) в helloworld.Main.main(Main.java:60) Java Результат: 1 Извините, я новичок во всем этом. Это исключение. Итак, я должен создать сопоставимый метод в моем классе?   -  person Khal    schedule 27.01.2015
comment
Не публикуйте важную информацию только в виде комментария (особенно если это код, который не может иметь правильный отступ в комментарии). Вместо этого используйте параметр edit, размещенный под вашим вопросом, чтобы добавить эту информацию в ваш вопрос (с правильным форматированием).   -  person Pshemo    schedule 27.01.2015
comment
По сути, это дубликат stackoverflow.com/q/2504803/3182664 и сотен других вопросов (обычно связанных с такими классами, как Student или Employee...)   -  person Marco13    schedule 27.01.2015
comment
Я также добавил метод compareTo в студенческий класс, помогло ли это, или у вас все еще есть та же ошибка? Вы добавили часть implements Comparable<Student> в объявление своего класса, как описано в опубликованном ответе?   -  person Pshemo    schedule 27.01.2015


Ответы (2)


Что вы подразумеваете под "порядком"? Если вы имеете в виду порядок их добавления, то просто используйте LinkedHashSet. Если вам нужна какая-то сортировка, вам нужно описать, как Student следует сортировать, заставив Student реализовать Comparable<Student> или предоставив Comparator<Student>.

Если вы имели в виду алфавитный порядок, вам следует изменить класс Student следующим образом:

class Student implements Comparable<Student> {
   ...
   public int compareTo(Student other) {
     return getName().compareTo(other.getName());
   }
}
person Louis Wasserman    schedule 27.01.2015
comment
Извините, я имел в виду в алфавитном порядке - person Khal; 27.01.2015
comment
@Khal Что, если у вашего ученика будет name и surname строк и age int? Как бы вы хотели его заказать, и как TreeSet должен об этом узнать? - person Pshemo; 27.01.2015
comment
Я просто очень хочу убрать имя, больше ничего - person Khal; 27.01.2015
comment
Я думаю, что точка зрения @Pshemo заключается в том, что вы должны указать, что вы хотите сортировать каким-то образом, Java не сможет решить это за вас, если вы этого не скажете. - person Louis Wasserman; 27.01.2015
comment
По причинам, указанным в stackoverflow.com/a/21659849/3182664 , обычно предпочтительнее использовать собственную реализацию Comparator вместо реализации интерфейса Comparable. Именно из-за вашего вступительного вопроса: Что вы подразумеваете под порядком? - Это может быть что угодно. У учащихся просто нет естественного порядка. - person Marco13; 27.01.2015

Для алфавитного порядка у вас есть 2 способа.

  1. Либо измените свой класс Student, реализовав сопоставимый интерфейс.

    Причина: когда мы добавляем элемент в TreeSet, то для каждого существующего объекта в Treeset JVM сравнивает текущий объект, вызывая для них метод compareTo/compare, и реализуя интерфейс Comparable, мы предоставляем реализацию метода compareTo.

  2. ИЛИ- Предоставьте объект Comparator при создании TreeSet, т.е.

    Collection<Student> tm = new TreeSet<Student>(new Comparator<Student>() {
    
        @Override
        public int compare(Student o1, Student o2) {
            return o1.getName().compareTo(o2.getName());
        }
    
    });
    

    Здесь я использовал анонимный компаратор. Надеюсь, это поможет.

person Ankur Garg    schedule 27.01.2015