Удалите дубликаты из Списка, содержащего объекты, используя коллекцию в Java - PullRequest
0 голосов
/ 28 апреля 2020

Я создал студенческий класс с подробностями studentId, StudentName и studentSemester. Затем добавлен конструктор для создания новых учеников. в основном методе я дал ниже.

Student s1 = new Student(101, "Ron", 1);
    Student s2 = new Student(102, "Angela", 9);
    Student s3 = new Student(103, "Hazel", 5);
    Student s4 = new Student(104, "David", 3);
    Student s5 = new Student(104, "Alan", 4);
    Student s6 = new Student(103, "Hazel", 5);
    Student s7 = new Student(101, "Ron", 1);
    List<Student> reEvaluationDetails = new ArrayList<Student>();
    reEvaluationDetails.add(s1);
    reEvaluationDetails.add(s2);
    reEvaluationDetails.add(s3);
    reEvaluationDetails.add(s4);
    reEvaluationDetails.add(s5);
    reEvaluationDetails.add(s6);
    reEvaluationDetails.add(s7);

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

Ответы [ 4 ]

0 голосов
/ 28 апреля 2020

Реализуйте equals и hashCode методы в Strudent и используйте Set,

class Student {
    public String name;
    public int id;
    public int semester;

    public Student(int id, String name, int semester) {
        this.id = id;
        this.name = name;
        this.semester = semester;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                semester == student.semester &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, id, semester);
    }
}

Затем используйте Set,

 LinkedHashSet<Student> students = new LinkedHashSet<>(reEvaluationDetails);
0 голосов
/ 28 апреля 2020

Вы должны рассмотреть возможность использования различных do c

reEvaluationDetails .stream (). Diver (). Collect (Collectors.toList ()).

Метод equals () вашего студенческого класса должен быть переопределен для обнаружения равенства между объектом Student

0 голосов
/ 28 апреля 2020

преобразование ArrayList в HashSet эффективно удаляет дубликаты, если вам нужно сохранить порядок вставки, вы также можете использовать это

Set<String> reEvaluationDetails = new LinkedHashSet<>(list);

reEvaluationDetails.add(s1);
reEvaluationDetails.add(s2);
reEvaluationDetails.add(s3);
reEvaluationDetails.add(s4);
reEvaluationDetails.add(s5);
reEvaluationDetails.add(s6);
reEvaluationDetails.add(s7);
0 голосов
/ 28 апреля 2020

Используйте набор.

Набор - это коллекция, которая, в отличие от списка, не допускает дублирования.

Set<Student> reEvaluationDetails = new HashSet<Student>();
reEvaluationDetails.add(s1);
reEvaluationDetails.add(s2);
reEvaluationDetails.add(s3);
reEvaluationDetails.add(s4);
reEvaluationDetails.add(s5);
reEvaluationDetails.add(s6);
reEvaluationDetails.add(s7);

и переопределяет равенства и хэш-код:

class Student {
    int id;
    String name;
    int whatever;

    Student(int id, String name, int whatever) {
        this.id = id;
        this.name = name;
        this.whatever = whatever;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                whatever == student.whatever &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, whatever);
    }
}

Когда вы проверите, что находится в наборе, вы увидите, что дубликатов нет.

Это самый эффективный способ сделать это.

Вы можете проверить, работает ли здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...