从列表中删除(并计算)重复项

     2023-02-25     180

关键词:

【中文标题】从列表中删除(并计算)重复项【英文标题】:remove (and count) duplicates from a list 【发布时间】:2022-01-20 22:45:34 【问题描述】:

是否可以在同一个列表的两个迭代器之间进行迭代并删除嵌套迭代器中的一个项目

版本 1(不起作用):

var i = all.iterator();
while (i.hasNext()) 
    var a = i.next();
    var j = all.iterator();
    while (j.hasNext()) 
        var b = j.next();
        if (!a.shouldBRemoved(b)) 
            a.setDuplicates(a.getDuplicates + 1);
            // I want to remove the element on the fly 
            // because on each iteration the iterated elements will have a decreased size and will iterate faster (because of fewer elements)
            // However: this does NOT work because of ConcurrentModificationException:
            j.remove();  
        
    

我得到一个java.util.ConcurrentModificationException,因为我在同一个迭代器中修改了一个元素..

我可以通过使用另一个列表removableItems 来解决这个问题,并将这些项目放入其中:

第 2 版(有效):

for (var a : all) 
    for (var b : all) 
        if (!a.shouldBRemoved(b)) 
            a.setDuplicates(a.getDuplicates + 1);
            // this works, 
            // however I must use an additation list to keep track of the items to be removed
            // it's also not more performant than removing the elements on the fly 
            // because on each iteration the iterated elements has the same size
            removableItems.add(b);
        
    

all.removeAll(removableItems);
    

有没有办法解决这个问题不需要需要中间列表removableItems我想即时删除元素。

【问题讨论】:

我不确定你想问什么。 没有任何代码 sn-ps 证明需要嵌套循环/迭代。如果方法 a.shouldBeRemoved 仅在 a 上调用而不使用/传递 b,则可以将其从外部迭代器中删除。 @AlexRudenko 好点。我确实忘记将b 传递给a.shouldBeRemoved()。我编辑了上面的代码。 在使用嵌套迭代器进行迭代时,您还应该检查 a == b 是否相等。你能澄清哪些项目应该被删除(重复?)以及哪些值应该保留在all中? 【参考方案1】:

尝试使用支持并发修改的CopyOnWriteArrayList

List < String > myList = new CopyOnWriteArrayList < String > ();
    myList.add("1");
    myList.add("2");
    myList.add("3");
    myList.add("4");
    myList.add("5");
    for (int i = 0; i < myList.size(); i++) 
      System.out.println("List value: " + myList.get(i));
      if (myList.get(i).equals("3")) 
        myList.remove(i);
        i--;
        myList.add("6");
      
    
    System.out.println("List Size:" + myList.size());

【讨论】:

这不是一个高效的解决方案:CopyOnWriteArrayList 将所有元素复制到新的内部副本中。所以它的行为类似于使用我的 version2【参考方案2】:

到目前为止,我找到了一个很好的解决方案(版本 3):

List<Item> removeDuplicates(List<Item> all) 
        var uniqueResults = new ArrayList<Item>();
        for (var a : all) 
            for (var b : all) 
                // check if "a" and "b" is not the same instance, but have equal content
                if (!a.equals(b) && a.isDeepEqualTo(b)) 
                    if (a.duplicates == 0 && b.duplicates == 0) 
                        // "a" has duplicates: 
                        // Add only "a" and discard "b" for the rest of the loops.
                        uniqueResults.add(a);
                    
                    // count the number of duplicates
                    a.duplicates = a.duplicates + 1;
                
            
            // "a" has no duplicates, add it.
            if (a.duplicates == 0 && !uniqueResults.contains(a)) 
                uniqueResults.add(a);
            
        
        return uniqueResults;

到目前为止它有效 - 我没有看到任何会错误(不)删除的边缘情况。

它也比使用 version 2(带有 removableItems()-list)更好,因为它的性能更高(特别是对于大型列表),因为我们不使用 removeremovAll,我们只添加项目(O(1))。

【讨论】:

这里是否曾经从all 中删除?如果重复的数量增加,它应该如何变为 0 ?另外,为什么删除索引i(即a)处的元素? @AlexRudenko 感谢您的帮助。我编辑了我的解决方案,这个解决方案有效,是迄今为止最好的。如果您能找到更好的解决方案或至少有改进版本 4 的建议,我会很高兴。 !a.equals(b) &amp;&amp; a.isDeepEqualTo(b) 永远为真时,软件设计存在根本问题。两个对象可以同时“深度相等”但“不相等”的逻辑迟早会出问题。 @Holger 相同和相等是有区别的。如果我使用equal()/hashCode(),那么我无法区分具有相同内容的两个不同实例。也许deepEqualTo()这个词有点不对,但这里的意思是:“比较两个不同的实例,如果内容(但不是实例)彼此相等,则返回true。” 当你的意思是“同一个实例”时,你应该使用==,这对读者来说很明显。 “比较两个不同的实例,如果内容(但不是实例)彼此相等,则返回 true”正是equals 的合同(当然,必须为您的自己的课程)

从列表中删除重复项?

】从列表中删除重复项?【英文标题】:removeduplicatesfromList?【发布时间】:2021-04-0210:20:15【问题描述】:我从适配器中的API获取重复项,但我想从我的适配器中删除这些重复项,并在知道如何打印后将其打印出来?提前致谢。... 查看详情

C#从列表中删除重复的对象并首先增加

】C#从列表中删除重复的对象并首先增加【英文标题】:C#Removeduplicatedobjectsfromlistandincreasefirst【发布时间】:2022-01-0909:18:34【问题描述】:我有一个对象列表=>classExampleintquantity;stringname;stringcomment;,我想删除所有重复项并将qua... 查看详情

从 Python 列表中删除重复项

】从Python列表中删除重复项【英文标题】:RemovingduplicatesfromlistoflistsinPython【发布时间】:2009-07-1713:45:48【问题描述】:如果想根据每个嵌套列表的第一个元素评估重复项,谁能提出一个从嵌套列表中删除重复项的好解决方案?... 查看详情

如何使用列表理解从列表中删除重复项? [复制]

】如何使用列表理解从列表中删除重复项?[复制]【英文标题】:Howtoremoveduplicateitemsfromalistusinglistcomprehension?[duplicate]【发布时间】:2012-05-1922:21:07【问题描述】:如何使用列表推导从列表中删除重复项?我有以下代码:a=[1,2,3,3,... 查看详情

从 Vue 中的 v-for 列表中删除重复项

】从Vue中的v-for列表中删除重复项【英文标题】:Removingduplicatesfromav-forlistinVue【发布时间】:2020-10-1022:42:12【问题描述】:我正在尝试按类别对我的笔记列表进行排序。我在一个类别中有多个笔记,所以v-for在列表中多次返回分... 查看详情

java示例代码_从列表中删除重复项

java示例代码_从列表中删除重复项 查看详情

如何从Java列表中删除重复项

】如何从Java列表中删除重复项【英文标题】:HowtoremoveduplicatesfromSetoflistinJava【发布时间】:2021-12-1314:38:04【问题描述】:我有一组列表,我想从无论每个列表中的元素顺序如何删除重复项,如下所示:我有这个作为输入[[-1,-1,2]... 查看详情

从 Ocaml 中的列表列表中删除重复项?

】从Ocaml中的列表列表中删除重复项?【英文标题】:RemovingduplicatesfromalistoflistsinOcaml?【发布时间】:2021-07-0120:24:42【问题描述】:我是Ocaml的新手,我被分配仅使用List模块删除列表列表的所有重复项。这是我写的代码:letsort_an... 查看详情

如何从我的列表中删除重复项? [复制]

】如何从我的列表中删除重复项?[复制]【英文标题】:HowcanIremoveduplicatesfrommylist?[duplicate]【发布时间】:2021-06-3014:16:05【问题描述】:我正在使用SwiftUI在视图中生成这个动态列表(显示生成列表的一部分):薰衣草柠檬石灰石... 查看详情

从 Java 中的多个列表中合并和删除重复项的最佳方法

】从Java中的多个列表中合并和删除重复项的最佳方法【英文标题】:BestwaytomergeandremoveduplicatesfrommultiplelistsinJava【发布时间】:2013-05-0310:13:28【问题描述】:我有一种情况,我将收到2+ArrayList&lt;Widget&gt;并且我需要能够合并... 查看详情

使用 Guava 从列表中删除重复项

】使用Guava从列表中删除重复项【英文标题】:RemoveduplicatesfromListusingGuava【发布时间】:2012-08-2720:23:51【问题描述】:我们如何在Guavaapi的帮助下从List中删除重复项?目前我正在关注这个:privateList<T>removeDuplicate(List<T>li... 查看详情

如何从列表 Dart 中删除重复项 |扑

】如何从列表Dart中删除重复项|扑【英文标题】:HowtoDeleteduplicateitemsfromaListDart|Flutter【发布时间】:2021-12-1015:56:34【问题描述】:我有一套物品。从这里我想删除所有重复的值。我试过这个finalList=[......users!];和这个print(users.toSet... 查看详情

python从列表中删除重复项(代码片段)

查看详情

从 2D 列表中删除连续重复项,python?

】从2D列表中删除连续重复项,python?【英文标题】:Removeconsecutiveduplicatesfroma2Dlist,python?【发布时间】:2014-04-1921:15:43【问题描述】:如何根据特定元素(在本例中为第二个元素)从2d列表中删除连续重复项。我尝试了一些与iter... 查看详情

从 json 列表 javascript 中删除重复项

】从json列表javascript中删除重复项【英文标题】:Removeduplicatesfromajsonlistjavascript【发布时间】:2021-07-2404:24:42【问题描述】:晚上好,我有这个来自mongoDB的列表,我想删除“标题”中包含的国家/地区的重复项,以将它们插入选... 查看详情

使用循环从字符数组列表中删除重复项? [复制]

】使用循环从字符数组列表中删除重复项?[复制]【英文标题】:Removingduplicatesfromanarraylistofcharactersusingaloop?[duplicate]【发布时间】:2015-12-0707:06:52【问题描述】:publicstaticArrayList<Character>removeDuplicates(ArrayList<Character>data)A... 查看详情

从列表中删除重复项

ListDeduper http://www.esqsoft.com/tools/dedupe-list.htm  CountDuplicatesinaListOnlineTool http://www.somacon.com/p568.php   http://textmechanic.com  查看详情

在合并包含列表时从包含列表的列表对象中删除重复项

】在合并包含列表时从包含列表的列表对象中删除重复项【英文标题】:Removeduplicatesfromalistobjectcontainingalistwhilemergingthecontaininglist【发布时间】:2018-03-2719:08:30【问题描述】:IhavaaPOJOClasses:classResponseprivateList<Transmission>transmi... 查看详情