在两本书中获取共同元素

时间:2015-04-21 22:16:43

标签: java list

我有两个数组列表,用于存储名为Book的类的实例。我正在尝试获取两个列表中的书/书。

这是一项搜索功能,可让您通过输入图书的ISBN,名称和作者来搜索图书。列表'结果A'包含输入的ISBN和名称的书籍,而另一个列表'结果B'包含输入作者撰写的书籍。为了获得最终结果,我需要获得两个数组中的书。

我尝试过使用retainAll()函数,但我发现它并不适用于存储实例的列表。

    List<Book> resultA = BookManager.getBooksWhere("book_ISBN", ISBN, "book_name", bookName);
    List<Book> resultB = BookManager.getBooksByAuthors(authors);
    resultB.retainAll(resultA);

    searchResults = resultA;

我是否可以使用其他功能来获取通用书籍?

(更新)

对不起,这是Book类:

    public class Book
    {
        private int bookID;
        private String bookISBN;
        private String category;
        private int libId;
        private String name;

        @Override
        public String toString()
        {
            String output = bookISBN + " - " + name + " - " + category + " - ";

            return output;
        }

        public int getBookID()
        {
            return bookID;
        }

        public void setBookID(int bookID)
        {
            this.bookID = bookID;
        }

        public String getBookISBN()
        {
            return bookISBN;
        }

        public void setBookISBN(String bookISBN)
        {
            this.bookISBN = bookISBN;
        }

        public int getLibId()
        {
            return libId;
        }

        public void setLibId(int libId)
        {
            this.libId = libId;
        }

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }
    }

(更新)

我不知道我必须覆盖Books类来实现这一点,并感谢指出DNA和pbabcdefp。我已经查明了如何做到这一点并且工作正常,这两本清单正在从这两本清单中删除。

这已插入到图书类中,并使用其唯一ID来比较图书是否相等。

    @Override
    public boolean equals(Object o)
    {
        if (o == null)
            return false;
        if (getClass() != o.getClass())
            return false;
        final Book otherBook = (Book) o;
        if (this.bookId != otherBook.bookId)
        {
            return false;
        }
        return true;
    }

2 个答案:

答案 0 :(得分:0)

假设你为Book类定义了一个equals函数,这里有一个函数可以得到两个数组中的公共元素:

 public static <T> List<T> getCommonElements(List<T> list1, List<T> list2) {
    List<T> resultsList = new ArrayList<>();
     for (T element1: list1) {
         for (T element2: list2) {
             if (element1.equals(element2)) {
                 resultsList.add(element2);
             }
         }
     }

     return resultsList;
 }

答案 1 :(得分:0)

这看起来像学校的问题。有了这个,我怀疑你正在寻找一个泛型或比较器的答案,或者覆盖compareTo或者相同的方法。

因此,您可以这样做:

for(int x=0; x<listA.size(); x++)
    for(int y=0; y<listB.size(); y++)
        if(listA.get(x).getISBN().equals(listB.get(y).getISBN()))
            return listA.get(x);

不使用equals进行比较,而是使用他们的ISBN,这应该是他们唯一的id。或者,您可以覆盖Book类中的equals方法来比较ISBN。