Возвращайте объекты Student с разными фамилиями

Существует коллекция из 20 объектов Student. Вы должны написать метод для возврата объектов Student с разными фамилиями.

Например, если Студентами являются Джон Доу, Джон Линкольн, Эми Доу, Фу Бар =>, тогда выходные данные должны возвращать объекты Студента для Джона Доу, Джона Линкольна, Фу Бара.

Это мой код. Что случилось ? Он печатает повторяющиеся объекты Student Akshay Jain и Om Jain. Поскольку фамилия такая же, ее следует избегать. В других случаях он дает правильный вывод.

class Student{
        private String firstName;
        private String lastName;
        public Student(String firstName, String lastName) {
            super();
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName( String firstName ) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName( String lastName ) {
            this.lastName = lastName;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result
                    + ((firstName == null) ? 0 : firstName.hashCode());
            result = prime * result
                    + ((lastName == null) ? 0 : lastName.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Student other = (Student) obj;
            if (firstName == null) {
                if (other.firstName != null)
                    return false;
            } else if (!firstName.equals(other.firstName))
                return false;
            if (lastName == null) {
                if (other.lastName != null)
                    return false;
            } else if (!lastName.equals(other.lastName))
                return false;
            return true;
        }

        @Override
        public String toString() {
            return "Student [firstName=" + firstName + ", lastName=" + lastName
                    + "]";
        }

        public static void main(String[] args) {

            TreeSet<Student> treeSet=new TreeSet<Student>(new MyComparator() {
            });
            treeSet.add(new Student("Akshay","Jain"));
            treeSet.add(new Student("Akshay","Shah"));
            treeSet.add(new Student("Rahul","Jain"));
            treeSet.add(new Student("Prakash","Patil"));        
            treeSet.add(new Student("Om","Jain"));
            treeSet.add(new Student("Chaitali","Mehata"));
            treeSet.add(new Student("Obama","Jain"));
            treeSet.add(new Student("Narendra","Jain"));
            treeSet.add(new Student("Vijay","Magdum"));
            treeSet.add(new Student("Hari","Patil"));
            treeSet.add(new Student("Anuj","Doshi"));
            treeSet.add(new Student("Arnav","Gandhi"));
            treeSet.add(new Student("Abhay","Jain"));
            treeSet.add(new Student("Kedar","Gandhi"));
            System.out.println(treeSet);
        }
    }

    class MyComparator implements Comparator<Student> {
        @Override
        public int compare(Student s1, Student s2) {
            if(s1.getLastName().equals(s2.getLastName()))           
                return 0;
            else            
                return +1;
        }
    }

person Akshay Jain    schedule 12.05.2015    source источник
comment
Вы могли бы хотя бы убрать пулю из названия   -  person chancea    schedule 12.05.2015
comment
На самом деле выполняя домашнее задание можно узнать много нового интересного!   -  person Umberto Raimondi    schedule 12.05.2015
comment
Вот забавный факт, есть так много примеров, как использовать компаратор для свойств объекта. Воспользуйтесь ими, уверяю вас, это будет буквально копипаст.   -  person We are Borg    schedule 12.05.2015
comment
возможный дубликат Как правильно использовать компаратор Java?   -  person vittore    schedule 12.05.2015


Ответы (2)


Ваш класс MyComparator неверен. Посмотрите на это:

class MyComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        int comp = s1.getLastName().compareTo(s2.getLastName());
        if (comp !=0 ) return comp;
        return s1.getFirstName().compareTo(s2.getFirstName());
    }
}

Метод «сравнить()» должен возвращать:

  • if s1<s2 => <0
  • if s1==s2 => 0
  • if s1>s2 => >0
person srcarro    schedule 12.05.2015

Я никогда не использовал TreeSets или компараторы, но я просмотрел документацию и сказал, что метод добавления использует логику

Добавляет указанный элемент в этот набор, если он еще не присутствует. Более формально, добавляет указанный элемент e в этот набор, если набор не содержит элемента e2 такого, что (e==null ? e2==null : e.equals(e2)). Если этот набор уже содержит элемент, вызов оставляет набор без изменений и возвращает false.

Поэтому я думаю, что проблема в том, что TreeMap не использует ваш компаратор для добавления только для сортировки.

Затем в методе добавления вызывается равный Студенту, и проблема лежит в строке

 else if (!firstName.equals(other.firstName))
        return false;

потому что он возвращает false перед сравнением фамилий, поэтому сравнение Akshay Jain и Om Jain возвращает false, а затем оба вставляются в TreeMap.

person JMorales    schedule 12.05.2015