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>();

请在否决投票之前,阅读问题并检查示例-这不是重复的

我想从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>();
        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是您现有列表存储的类型):

  • 分配一个
    映射
    。整数将用于存储该项在列表中出现的次数
  • 反复浏览您的列表。在地图上查找每个项目。如果它不存在,请返回一个计数。如果它已经存在于映射中,则增加计数并返回新计数
  • 迭代映射中的条目以提取消除重复的列表。您不会包含任何值大于1的条目

  • 这种方法即使对于大型列表也很快。

    您可以使用循环检查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);
    }