如何将每条记录与同一List Java中的所有其他记录进行比较?

时间:2012-05-29 15:53:49

标签: java list foreach arraylist compare

我有一个清单:

List<BookDTO> bookList = libraryDTO.getBooks();

int bookCounter = 0;
for (BookDTO bookdto : bookList)
{
       if ((!errors.isEmpty() && !errors.containsKey("book[" + bookCounter + "].bookRefNo") || errors.isEmpty()) &&
           // do comparison for each record with other records in same list ) {

           errors.put("book[" + bookCounter + "].bookRefNo", messageSource.getMessage("bookRefNo.cannot.be.same", null, null));
        }

    bookCounter++;
    }

现在,我不知道如何进行比较检查..基本上如果有匹配的记录(记录具有相同的值),我应该得到密钥。

2 个答案:

答案 0 :(得分:2)

我不明白,如果有两本具有相同值的书籍会引发错误(看起来如此查看您的代码),或者您是否只想在计算时跳过它。

在任何情况下,如果没有为每个元素循环整个集合(即 O(n ^ 2)复杂度,则不能使用不考虑密钥的数据结构)。

你可以使用更合适的东西吗?

List<BookDTO> bookList = libraryDTO.getBooks();
Set<BookDTO> bookSet = new HashSet<BookDTO>(bookList);

bookCounter = bookSet.size();

当然,这假定BookDTO具有equals(..)hashCode()的正确实施。您甚至可以使用类似TreeSet<BookDTO>的排序集,但这会假设为BookDTO implements Comparable<BookDTO>

答案 1 :(得分:0)

好吧我猜你的BookDTO有一个bookRefNo属性,你不希望有多本书有相同的bookRefNo。

一种解决方案是依赖于Set不包含重复元素的事实,因此在循环中你可以这样做:

Set<String> bookRefs = new HashSet<String>();
for (BookDTO bookdto : bookList)
{
    if (!bookRefs.add(bookDto.getBookRef()))
    {
        // if we are here we tried to insert the same bookRef more than once...
    }
}