【问题标题】:Remove all repeated list members删除所有重复的列表成员
【发布时间】:2015-11-21 00:17:25
【问题描述】:

我有一个充满对象的数组,如果两个对象相同,我想删除它们。

这是我目前的方法,它返回一个

java.util.ConcurrentModificationException

public void deleteDuplicates(ArrayList<Object> objectArrayList){

    Iterator<Object> objectIterator = objectArrayList.iterator();
    Iterator<Object> objectIterator2 = objectArrayList.iterator();

    while(objectIterator.hasNext()){
        Object object = objectIterator.next();

        while(objectIterator2.hasNext()){
            if(object.equals(objectIterator2.next())){
                objectIterator2.remove();
                objectIterator.remove();
            }
        }
    }
}

【问题讨论】:

  • 但是从外观上看,如果我们真的挑剔,你有一个ArrayList,它是List,而不是an array: -)。
  • 编辑标题,谢谢
  • 如果你删除了一些元素之间的元素,你怎么能从一个元素移动到另一个元素?
  • 当奇数个对象相同时,你想发生什么?
  • @AndyThomas 我想删除所有重复的对象,包括奇数

标签: java arrays list arraylist iterator


【解决方案1】:

此代码将删除所有多次出现的列表成员。

这种方法处理奇数个重复。因此它不会检测和删除重复对,因为这可能会留下孤立重复。相反,它先计数,然后删除重复。

public static void deleteDuplicates( List<Object> objectList) {
    HashMap<Object,Integer> counts = new HashMap<>();
    for ( Object o : objectList ) {
        int oldCount = counts.containsKey( o )
            ? counts.get( o ).intValue()
            : 0;
        counts.put( o, oldCount + 1 );
    }

    for ( Iterator<Object> it = objectList.iterator(); it.hasNext(); ) {
        Object o = it.next();
        if ( 1 < counts.get( o )) {
            it.remove();
        }
    }
}

注意,这种方式要求列表成员的hashCode()方法满足Object.hashCode()指定的契约,包括:

如果两个对象根据equals(Object)方法相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多