我有一个清单:
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++;
}
现在,我不知道如何进行比较检查..基本上如果有匹配的记录(记录具有相同的值),我应该得到密钥。
答案 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...
}
}