【问题标题】:How to compare each record with all other records in a same List Java?如何将每条记录与同一个 List Java 中的所有其他记录进行比较?
【发布时间】:2012-06-03 21:05:51
【问题描述】:

我有一个清单:

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

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

【问题讨论】:

  • 1.您的代码无法编译。 2. 你想要达到的目标不是很清楚。
  • 从 if 语句中删除对 isEmpty() 的调用 - 如果我正在编写实现,我(可能)在 containsKey() 中做的第一件事就是检查列表是否空的。此外,您将(您应该)每次都遇到相同的错误 - 在循环之外捕获它。而且我不确定以这种方式“管理”错误有什么好处。

标签: java list foreach arraylist compare


【解决方案1】:

好吧,我猜你的 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...
    }
}

【讨论】:

  • Ossummm.!!谢谢@pgras ;-) 它的工作很棒..感谢所有评论者...
【解决方案2】:

我不明白如果有两本书具有相同的值应该引发错误(看起来如此看你的代码)或者如果你只想在计数时跳过它。

在任何情况下,如果不为每个元素循环整个集合(即 O(n^2) 复杂性)。

你能用更合适的东西吗,比如一套?

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

bookCounter = bookSet.size();

当然,这假设BookDTOequals(..)hashCode() 有正确的实现。你甚至可以使用像TreeSet&lt;BookDTO&gt; 这样的排序集,但这会假设BookDTO implements Comparable&lt;BookDTO&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2012-02-24
    • 2022-01-18
    相关资源
    最近更新 更多