繁体   English   中英

谁能解释如何使用indexOf,lastIndexOf删除ArrayList中的重复项

[英]Can anyone explain how to remove duplicates in ArrayList using indexOf,lastIndexOf

我有这段代码,我无法理解代码的工作原理,它如何删除具有indexOf和lastIndexOf的重复项?

ArrayList<String> lst = new ArrayList<String>();
lst.add("ABC");
lst.add("ABC");
lst.add("ABCD");
lst.add("ABCD");
lst.add("ABCE");

System.out.println("Duplicates List "+lst);

Object[] st = lst.toArray();
for (Object s : st) {
    if (lst.indexOf(s) != lst.lastIndexOf(s)) {
        lst.remove(lst.lastIndexOf(s));
    }
}

System.out.println("Distinct List "+lst);

这是一种很笨拙(即效率低下)的方法1

它是如何工作的?

这个谓词:

  lst.indexOf(s) != lst.lastIndexOf(s)

正在测试以查看列表中是否存在s两个(或更多)实例。 逻辑是,如果列表中的前s和后s的位置不同,则必须至少有两个。 然后我们删除最后一个实例。

由于我们对原始列表中的每个字符串都执行此操作,因此如果列表中有M个给定字符串的实例,则对该字符串将执行M次测试,并将成功进行M-1次,因此删除M-1这些实例。 最后,您只剩下每个不同字符串的一个实例。 即没有重复。


1-它是O(N^2) ,并且可以使用O(N)临时空间消除O(N)重复项。 通用方法如下:

  1. 创建一个临时数组来保存列表内容,并创建一个HashSet
  2. 对于每个s原始列表:
    • 如果s不在集合中:
      • 将其添加到集合中,然后
      • 将其添加到临时数组。
  3. 清除原始列表。
  4. 重新添加临时数组中的所有元素。

尝试在其中添加一些打印语句,我想您将能够自己看到!

    for (Object s : st) {
        System.out.println(s);
        System.out.println(lst.indexOf(s));
        System.out.println(lst.lastIndexOf(s));

        if (lst.indexOf(s) != lst.lastIndexOf(s)) {
            lst.remove(lst.lastIndexOf(s));
        }

    }

如何删除带有indexOf和lastIndexOf的重复项?

if (lst.indexOf(s) != lst.lastIndexOf(s))

上述代码发生的第一次出现的索引s (如果它存在否则-1 )在列表内,并且还需要最后一次出现的索引s (如果它存在否则-1 )在列表中,如果两个索引相同 ,则没有重复;如果索引 相同,则我们发现了重复,因此将其从列表中删除。

从您当前正在使用的代码中,我们可以确认字符串"ABC"在集合中出现了两次,一个在索引0 ,另一个在索引1因此当通过if语句检查时,我们可以保证控件将进入if语句,因为它们不是相同的索引(意味着至少存在两次s ),同样,字符串"ABCD"在列表12处出现两次(此时注意最后一个"ABC"出现已从列表中删除,因此"ABCD"由于列表本身调整大小的性质而占用了索引1的位置),这意味着控制将再次进入if块内部,因为它们不是相同的索引。

最终, s的最后一次出现将从列表中删除,并对循环的每次迭代重复相同的过程。

您可以使用更有效的方法从列表中删除重复项 ,因此应该对其进行调查,因为这样做可以缩短性能时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM