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

Java 如何将每个记录与同一列表中的所有其他记录进行比较?,java,list,foreach,arraylist,compare,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()) &&

我有一份清单:

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++;
    }
List bookList=libraryDTO.getBooks();
int bookCounter=0;
for(BookDTO BookDTO:bookList)
{
if((!errors.isEmpty()&&&!errors.containsKey(“book[“+bookCounter+”].bookRefNo”)| | errors.isEmpty())&&
//将每个记录与同一列表中的其他记录进行比较){
错误.put(“book[“+bookCounter+”].bookRefNo”,messageSource.getMessage(“bookRefNo.cannot.be.same”,null,null));
}
图书计数器++;
}

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

我不明白如果有两本具有相同值的书会导致错误(查看代码似乎很困难),或者如果您只想在计数时跳过它

在任何情况下,如果数据结构不考虑一个键,就不能为每个元素循环整个集合(即O(n^2)复杂性)

你能用一套更合适的吗

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

bookCounter = bookSet.size();
List bookList=libraryDTO.getBooks();
Set bookSet=新哈希集(bookList);
bookCounter=bookSet.size();

当然,这假设
BookDTO
equals(…)
hashCode()
有正确的实现。您甚至可以使用排序集,如
TreeSet
,但这将假定
BookDTO实现可比较的

好的,我想您的BookDTO具有bookRefNo属性,您不希望有多本书具有相同的bookRefNo

一种解决方案是依赖于a不包含重复元素的事实,因此在循环中可以执行以下操作:

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...
    }
}
Set bookRefs=new HashSet();
for(BookDTO BookDTO:bookList)
{
如果(!bookRefs.add(bookDto.getBookRef()))
{
//如果我们在这里,我们尝试多次插入同一bookRef。。。
}
}

1。您的代码无法编译。2.您试图实现的目标不是很清楚。请从if语句中删除对
isEmpty()
的调用-如果我正在编写实现,我(可能)在
containsKey()中要做的第一件事就是检查列表是否为空。此外,您每次都会(应该)得到相同的错误—在循环之外捕获它。我也不知道这样“管理”错误会给你带来什么好处。!!谢谢@pgras;-)非常好,谢谢所有的评论。。。