[英]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)
重复项。 通用方法如下:
HashSet
。 s
原始列表:
s
不在集合中:
尝试在其中添加一些打印语句,我想您将能够自己看到!
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"
在列表1
和2
处出现两次(此时注意最后一个"ABC"
出现已从列表中删除,因此"ABCD"
由于列表本身调整大小的性质而占用了索引1
的位置),这意味着控制将再次进入if
块内部,因为它们不是相同的索引。
最终, s
的最后一次出现将从列表中删除,并对循环的每次迭代重复相同的过程。
您可以使用更有效的方法从列表中删除重复项 ,因此应该对其进行调查,因为这样做可以缩短性能时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.