【问题标题】:Java Duplicates in Arraylist [duplicate]Arraylist 中的 Java 重复项
【发布时间】:2012-01-26 04:27:20
【问题描述】:

可能重复:
Java: Detect duplicates in ArrayList?

我有一个奇怪的问题。当评论被添加到表单时,我会发送电子邮件警报。基本上每条评论都有自己的id,但多个评论可以附加到某种形式。

在这种情况下,我添加了 3 条评论。两个被添加到一个表格中,最后一个被添加到另一个表格中。所以我希望它只发送 2 份表格。电子邮件正在发送 3 份表格。我知道 3 个 bean 将被填充,但 2 个将具有相同的数据,因为 2 个注释属于相同的表单。我尝试了一些我在此处看到的用于 dups 的算法,但我猜代码无法识别重复元素,因为每个备注都有自己的 id??

出于迭代目的,JSP 要求我将 hotParts 列表放入另一个 ArrayList

这是代码..还有更多内容,但这是最重要的部分

谢谢

   try
                    {
                        List<Object> dataList = new ArrayList<Object>();
                        Set<Long> ids = new HashSet<Long>();

                        for (HotPartsRemarkBean remark : latestHotPartRemarks)
                        {
                            ids.add(remark.getHpId());  
                        }

                            for ( Long id : ids)
                            {
                                hotPart = hotPartsDAO.getHotPartById(id);
                                dataList.add( hotPart ); //List Of Hot Parts Beans
                            }


               THIS WORKS!!!!!!! :)

【问题讨论】:

  • 请正确缩进代码
  • 这段代码与您遇到的问题有什么关系?
  • @adarshr 你有编辑的能力,所以请加入。
  • @DaveJohnston 因为我将 dataList 传递给 jsp 并得到 3 个结果,并且 3 个中有 2 个是相同的
  • @ErickRobertson 我打算稍后再做。感谢您的编辑!

标签: java


【解决方案1】:
  • 如果您不需要随机访问,请使用Set (HashSet)
  • 如果您不需要随机访问,但需要保持顺序,请使用LinkedHashSet
  • 如果您需要它是 List,但需要唯一性,请使用 commons-collections 中的 SetUniqueList

【讨论】:

  • 我还建议覆盖 Object.equals(Object other):boolean 来比较字段值并忽略 id 属性。然后,根据您在 Object.equals(Object other):boolean 中比较的相同字段覆盖 Object.hashCode():int 以散列也是一个好习惯。
【解决方案2】:

如果您正在寻找一种隐式禁止重复的数据结构,请使用Set

【讨论】:

    【解决方案3】:

    @gurung 有一个很好的观点我想强调,但他删除了他的帖子(编辑:看起来他没有删除它)。您每次都向dataList 添加相同的列表。对hotParts 的更改将修改dataList 的每个条目,因为每个条目都指向同一个对象。所以你会留下一个dataList,其中包含 N 个相同的列表(实际上是 same 列表)。

    如果您希望dataList 的每个元素独立,则需要在循环的每次迭代中创建一个新的hotParts

    for (...) {
        List<HotPartsBean> hotParts = new ArrayList<HotPartsBean>();
        ...
        dataList.add(hotParts);
    } 
    

    或者,根据您的期望,您可以将列表复制到dataList

    dataList.add(new ArrayList<HotPartsBean>(hotParts));
    

    【讨论】:

      【解决方案4】:

      为 HotPartsBean 实现“Comparable”接口并覆盖“compareTo”方法。然后使用您使用的相同算法(可能是您从 List 转换为 Set 的算法)或仅使用不同的数据结构。这样可以避免重复。

      另外,重构你的代码并定义List&lt;Object&gt; dataList = new ArrayList&lt;Object&gt;();如下:

      List<List<HotPartsBean>> dataList = new ArrayList<List<HotPartsBean>>();
      

      【讨论】:

        【解决方案5】:
         try
                            {
                                List<Object> dataList = new ArrayList<Object>();
                                Set<Long> ids = new HashSet<Long>();
        
                                for (HotPartsRemarkBean remark : latestHotPartRemarks)
                                {
                                    ids.add(remark.getHpId());  
                                }
        
                                    for ( Long id : ids)
                                    {
                                        hotPart = hotPartsDAO.getHotPartById(id);
                                        dataList.add( hotPart ); //List Of Hot Parts Beans
                                    }
        

        【讨论】:

          猜你喜欢
          • 2011-01-26
          • 2023-03-04
          • 2012-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-29
          相关资源
          最近更新 更多