2015-01-27 3 views
0

Когда я запускаю следующий код:Возвращение 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()); 
} 
+2

Всегда, всегда, всегда отправляйте исключение (или ошибку времени компиляции), когда ваш вопрос включает в себя один. Я предполагаю, что 'Student' не реализует' Comparable', но мы не можем сказать, поскольку у нас нет ни исключения, ни класса 'Student' ... –

+1

Вы не читаете javadoc TreeSet. В нем говорится: * Элементы упорядочиваются с использованием их естественного упорядочения или Компаратором, предоставленным в заданное время создания, в зависимости от того, какой конструктор используется *. Часть * естественного упорядочения * ссылается на Comparable, который ваш класс не реализует. И вы не предоставили компаратора. Как TreeSet сравнивает несопоставимые элементы? –

+0

Исключение в теме "main" java.lang.ClassCastException: helloworld.Student нельзя отнести к java.lang.Comparable в java.util.TreeMap.put (TreeMap.java:542) at java.util.TreeSet.add (TreeSet.java:238) at helloworld.Main.main (Main.java:60) Java Результат: 1 Извините, я новичок ко всему этому. Это исключение. Так что мне нужно создать сопоставимый метод в моем классе? – Khal

ответ

7

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

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

class Student implements Comparable<Student> { 
    ... 
    public int compareTo(Student other) { 
    return getName().compareTo(other.getName()); 
    } 
} 
+0

Жаль, что имею в виду в алфавитном порядке – Khal

+0

@Khal Что делать, если у вашего ученика были бы «имя» и «фамилия»? Строки и 'age' int? Как вы хотите заказать его и как TreeSet должен знать об этом? – Pshemo

+0

Я просто хочу отбросить имя, ничего больше – Khal

1

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

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

    Причина: - Когда мы добавляем элемент TreeSet то для каждого существующего объекта в TreeSet JVM сравнивает текущий объект с помощью вызова CompareTo/сравнить метод на них и за счет реализации интерфейса Сопоставимые мы предоставляем метод CompareTo implementaton.

  2. ИЛИ- Обеспечить объект компаратора при создании TreeSet т.е.

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

    Здесь я использовал анонимный Comparator.Hope это помогает.