Java 从ArrayList中删除每个重复的元素
请在否决投票之前,阅读问题并检查示例-这不是重复的 我想从Java中的ArrayList中删除每个重复的元素,如下所示:Java 从ArrayList中删除每个重复的元素,java,arraylist,duplicates,duplicate-removal,Java,Arraylist,Duplicates,Duplicate Removal,请在否决投票之前,阅读问题并检查示例-这不是重复的 我想从Java中的ArrayList中删除每个重复的元素,如下所示: Original list: [4, 2, 2, 3, 4, 1] Set result: [1, 2, 3, 4] Desired result: [1, 3] 显然,重复集的解决方案在这里不起作用 我的解决方案: ArrayList<Integer> arrayList = new ArrayList<Integer>();
Original list: [4, 2, 2, 3, 4, 1]
Set result: [1, 2, 3, 4]
Desired result: [1, 3]
显然,重复集的解决方案在这里不起作用
我的解决方案:
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(5);
arrayList.add(1);
arrayList.add(5);
arrayList.add(1);
arrayList.add(5);
arrayList.add(2);
arrayList.add(3);
ArrayList<Integer> temp = new ArrayList<>(arrayList);
for(Integer number : new HashSet<Integer>(arrayList)){
temp.remove(number);
}
arrayList.removeAll(temp);
ArrayList ArrayList=new ArrayList();
arrayList.add(5);
arrayList.add(1);
arrayList.add(5);
arrayList.add(1);
arrayList.add(5);
arrayList.add(2);
arrayList.add(3);
ArrayList temp=新的ArrayList(ArrayList);
for(整数:新哈希集(arrayList)){
移除温度(编号);
}
arrayList.removeAll(临时);
有更聪明/更聪明的解决方案吗 有很多方法可以做你想做的事情。下面是一个(其中T是您现有列表存储的类型):
映射
。整数将用于存储该项在列表中出现的次数这种方法即使对于大型列表也很快。您可以使用循环检查ArrayList中的重复项,然后在ArrayList上使用
remove()
删除元素
请参见以下内容:
{
ArrayList list;
// ...
while(true)
for(final Integer o : list) {
if(list.indexOf(o) != list.lastIndexOf(o)) {
while(list.remove(o));
continue;
}
break;
}
}
另一种更好的方法是使用临时Set
存储要删除的对象:
{
ArrayList list;
TreeSet<Integer> set = new TreeSet<>(); // Use your Set!
// ...
for(final Integer o : list)
if(list.indexOf(o) != list.lastIndexOf(o))
set.add(o);
for(final Integer o : set)
while(list.remove(o));
}
{
数组列表;
TreeSet set=new TreeSet();//使用您的集合!
// ...
for(最终整数o:list)
if(list.indexOf(o)!=list.lastIndexOf(o))
设置。添加(o);
for(最终整数o:set)
while(list.remove(o));
}
或者,您也可以检查频率<代码>集合。频率(数组列表、编号)
publicstaticvoidmain(字符串[]args){
ArrayList ArrayList=新的ArrayList();
arrayList.add(5);
arrayList.add(1);
arrayList.add(5);
arrayList.add(1);
arrayList.add(5);
arrayList.add(2);
arrayList.add(3);
ArrayList unique=新的ArrayList();
for(整数:arrayList){
if(Collections.frequency(arrayList,number)==1){
唯一。添加(编号);
}
}
System.out.println(唯一);
}
提供的副本不正确,但您仍然没有表现出任何努力。什么副本?不管怎样,你面临的问题和问题是什么?我能看到你们想要实现什么,但我看不到你们解释是什么阻止你们这样做的部分。我在2分钟前问过这个问题,在重复的问题上得到了6票反对票,但显然不是。@mickey你们的链接不正确。勾选“期望结果”,而不是“设置结果”。既然你已经有了一个有效的解决方案,并且你对改进它感兴趣(我假设它没有bug),你应该把你的问题发布在。一般规则是(1)如果您的代码可以工作,但您希望听到如何更好地在代码审查后工作(2)如果您试图让代码在堆栈溢出后工作。无论如何,既然你已经在Stack Overflow上发布了你的问题,这个建议是为了你将来的问题(你应该只在StackExchange的一个站点上发布问题,所以选择so或CR,不要在两个站点上发布相同的问题)。很好。我甚至不需要柜台。简单的true/false就足够了:)我认为最好是简单地复制列表-在一个列表上迭代,然后从另一个列表中删除:)您不应该修改正在为每个循环迭代的集合。@Pshemo我已经修复了它。请注意,Iterable
中使用的for
-每个循环同时调用.next()
,直到.hasNext()
返回false,因此每次修改后都需要重新启动迭代(继续->重做,而(true)
块->for
-再次)。仅供参考,添加了使用临时集合的解决方案。您还可以将频率条件更改为==1,然后将结果列表用作不重复的数字列表。是。好主意。这将避免额外的循环。更新了我的答案:)
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(5);
arrayList.add(1);
arrayList.add(5);
arrayList.add(1);
arrayList.add(5);
arrayList.add(2);
arrayList.add(3);
ArrayList<Integer> unique = new ArrayList<>();
for (Integer number : arrayList) {
if (Collections.frequency(arrayList, number) == 1) {
unique.add(number);
}
}
System.out.println(unique);
}