0

我有一个清单:

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++;
    }

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

4

2 回答 2

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>

于 2012-05-29T15:58:46.120 回答
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...
    }
}
于 2012-05-29T16:19:24.703 回答