Java 如何从对象列表中删除重复元素

Java 如何从对象列表中删除重复元素,java,Java,如何从图书列表中删除重复元素,其中作者和语言相同,但标题不同 在这种情况下,我想删除任意两个位置(因为它们具有相同的作者和语言): 我想删除任何一个位置(因为他们有相同的作者和语言): 图书类别: public class Book { private String author; private String language; private String title; public Book(String author, String langua

如何从图书列表中删除重复元素,其中作者和语言相同,但标题不同

在这种情况下,我想删除任意两个位置(因为它们具有相同的作者和语言):

我想删除任何一个位置(因为他们有相同的作者和语言):

图书类别:

public class Book {
    private String author;
    private String language;
    private String title;
    
    public Book(String author, String language, String title) {
        this.author = author;
        this.language = language;
        this.title = title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    public String getTitle() {
        return this.title;
    }
    
    public void setLanguage(String language) {
        this.language = language;
    }
    
    public String getLanguage() {
        return this.language;
    }
    
    public void setAuthor(String author) {
        this.author = author;
    }
    
    public String getAuthor() {
        return this.author;
    }
}
Main.class:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Book> books = new ArrayList<Book>();
        books.add(new Book("Hemigway","english","Old man"));
        books.add(new Book("Willis","english","Black and white"));
        books.add(new Book("Hemigway","english","Lord of the ring"));
        books.add(new Book("Harper Lee","english","Mockingbird"));
        books.add(new Book("Fitzgerald","english","The catcher"));
        books.add(new Book("Hemigway","english","Border life"));
        books.add(new Book("Harper Lee","english","Other books"));
        
        for(Book book : books) {
            System.out.println(book.getAuthor() + " : "+book.getLanguage()+" : "+book.getTitle());
        }
        
    }

}
import java.util.ArrayList;
导入java.util.List;
公共班机{
公共静态void main(字符串[]args){
List books=new ArrayList();
新增(新书(“海米威”、“英语”、“老人”);
新增(新书(“威利斯”、“英语”、“黑白”);
新增(新书(“海米威”、“英语”、“魔戒”);
新增(新书(“哈珀·李”、“英语”、“模仿鸟”);
新增(新书(“菲茨杰拉德”、“英语”、“捕手”);
增加(新书(“海米威”、“英语”、“边境生活”);
增加(新书(“哈珀·李”、“英语”、“其他书”);
用于(书籍:书籍){
System.out.println(book.getAuthor()+”:“+book.getLanguage()+”:“+book.getTitle());
}
}
}

您应该使用两个概念

  • 设置
  • equal()和hashcode
  • 这是代码,使用Main方法中的Set

    import java.util.HashSet;
    import java.util.Objects;
    import java.util.Set;
    
    public class Main {
        public static void main(String[] args) {
            Set<Book> books = new HashSet<>();
            books.add(new Book("Hemigway","english","Old man"));
            books.add(new Book("Willis","english","Black and white"));
            books.add(new Book("Hemigway","english","Lord of the ring"));
            books.add(new Book("Harper Lee","english","Mockingbird"));
            books.add(new Book("Fitzgerald","english","The catcher"));
            books.add(new Book("Hemigway","english","Border life"));
            books.add(new Book("Harper Lee","english","Other books"));
    
            for(Book book : books) {
                System.out.println(book.getAuthor() + " : "+book.getLanguage()+" : "+book.getTitle());
            }
    
        }
    }
    
    以下是输出:

    Harper Lee : english : Mockingbird
    Fitzgerald : english : The catcher
    Hemigway : english : Old man
    Willis : english : Black and white
    

    您只需使用
    equals
    hashcode
    以及
    stream
    distinct
    方法即可实现这一点

    更改Books类以包括以下方法

    class Book {
    
        /*
         * your already written code here. Add following in addition to your code
         * */
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Book book = (Book) o;
            return author.equalsIgnoreCase(book.author) && language.equalsIgnoreCase(book.language);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(author, language);
        }
    }
    
    现在将main方法更改为具有不同对象的新列表

    public static void main(String[] args) {
    
        /*
         * your already written code here. Add following in addition to your code
         * */
    
        List<Book> newBooks = books.stream().distinct().collect(Collectors.toList());
    
        for (Book book : newBooks)
            System.out.println(book.getAuthor() + " : " + book.getLanguage() + " : " + book.getTitle());
    
    }
    
    publicstaticvoidmain(字符串[]args){
    /*
    *您已经在此处编写了代码。除了代码之外,还添加以下内容
    * */
    List newBooks=books.stream().distinct().collect(Collectors.toList());
    用于(书籍:新书)
    System.out.println(book.getAuthor()+”:“+book.getLanguage()+”:“+book.getTitle());
    }
    
    但是如果它有不同的标题。。。你为什么认为是复制品?@Jordy我想他想说的是过滤掉那些相似的东西
    Harper Lee : english : Mockingbird
    Fitzgerald : english : The catcher
    Hemigway : english : Old man
    Willis : english : Black and white
    
    class Book {
    
        /*
         * your already written code here. Add following in addition to your code
         * */
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Book book = (Book) o;
            return author.equalsIgnoreCase(book.author) && language.equalsIgnoreCase(book.language);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(author, language);
        }
    }
    
    public static void main(String[] args) {
    
        /*
         * your already written code here. Add following in addition to your code
         * */
    
        List<Book> newBooks = books.stream().distinct().collect(Collectors.toList());
    
        for (Book book : newBooks)
            System.out.println(book.getAuthor() + " : " + book.getLanguage() + " : " + book.getTitle());
    
    }