Java Arraylist - 将一个复制到另一个没有重复

时间:2010-08-24 18:26:37

标签: java arraylist

我有ArrayList

Arraylist<Person> list1 = new ArrayList<Person>();
list1.add(new Person("John", 0));
list1.add(new Person("Kane", 0));
list1.add(new Person("Jen", 0));

另一个ArrayList

Arraylist<Person> list2 = new ArrayList<Person>();
list2.add(new Person("John", 2));
list2.add(new Person("Kane", 4));

我希望生成的ArrayList包含:

("John", 2) ("Kane", 4) ("Jen", 0)

我想合并这两个列表并删除值为0的列表。如果我这样做了 list2.addAll(list1),然后list2有两个“John”条目,值为2和0.我想从此列表中删除值为0的条目。

9 个答案:

答案 0 :(得分:8)

听起来,在您的程序逻辑中,创建一个

new Person("John", 2)

不是你想要的 - 是否真的有一个叫做John的“新人”?或者是具有新分数的相同的旧约翰?也许您需要一个功能来更新个人的分数,如

Person.setValue(int)

很抱歉,如果这实际上没有回答您的问题,但检查您是否拥有正确的数据结构非常重要。

答案 1 :(得分:2)

订单重要吗?如果没有,则SetList更有意义。 Set历史上一直没有被程序员用于数组思考。

如果顺序不重要,那么使用自定义比较器的TreeSet就是一种相当苛刻的方法。或者,使用Map<String,Person>(可能是LinkedHashMap)。

答案 2 :(得分:2)

在我看来,你真正想要的是一张地图。创建其中一个,并为任一列表中的每个Person,将值0放入地图中,并将人名作为键。现在,对于每个列表中的每个人,从地图中获取人名的值,将人的值添加到该人,并将结果存储回地图。现在,如果你真的需要它在ArrayList中,那么从地图中将键值对提取到一个新列表中是一件简单的事情。

答案 3 :(得分:2)

好像你想要每个用户的最大值:

List<Person> all = new ArrayList<Person>();
all.addAll(list1);
all.addAll(list2);

Map<String, Person> map = new HashMap<String, Person>();
for (Person p : all) {
    if (!map.containsKey(p.name) || map.get(p.name).num < p.num) {
        map.put(p.name, p);
    }
}
List<Person> merged = new ArrayList<Person>(map.values());

答案 4 :(得分:1)

创建一个只按名称比较它们的比较器(如果你还没有这样做的equals())。

按照人物价值的减少顺序对列表进行排序(考虑到价值为正。是吗?)

然后,基于此Comparator创建一个集合。现在你可以调用addAll。

答案 5 :(得分:1)

从您的示例中可以看出,从名称到“数字 - 均值”的映射是更合适的数据结构。有了这样的地图,您只需:

map1.putAll(map2);

如果您不希望第二张地图获胜,但是价值较高的条目,则必须执行以下操作:

for (Map.Entry<String, Integer> e : map2.entrySet()) {
    Integer v = map1.get(e.getKey());
    if (v == null || v < e.getValue()) {
        map1.put(e.getKey(), e.getValue());
    }
}

答案 6 :(得分:1)

这个怎么样?

在人类中:

@Override
public boolean equals(Object obj) {
    Person o = (Person) obj;
    if (o.getNombre().equals(this.nombre)) {            
        return true;    
    }
    return false;
}

然后:

    list2.addAll(list1);
    final ArrayList<Person> list3 = list2;
    CollectionUtils.filter(list2, new Predicate() {         

        public boolean evaluate(Object arg0) {
            if (((Person) arg0).getId() == 0 && CollectionUtils.cardinality(arg0, list3) > 1) {
                return false;
            } else {
                return true;
            }
        }
    });

答案 7 :(得分:0)

怎么样......

ArrayList<Person> list3 = new ArrayList<Person>();
list3.addAll( list1 );
list3.addAll( list2 );

System.out.println( "BEFORE" );
for ( Person person : list3 )
    System.out.println( person.getName() + " = " + person.getIntParam() );

filterPeople( list3 );

System.out.println( "AFTER" );
for ( Person person : list3 )
    System.out.println( person.getName() + " = " + person.getIntParam() );

过滤方法:

public static void filterPeople( List<Person> people ) {
    for ( int i = 0 ; i < people.size(); i++ ) {
        Person person = people.get( i );
        if ( person.getIntParam() == 0 )
            people.remove( i-- );
    }
}

答案 8 :(得分:0)

使用地图听起来是最好的选择,套装也可以。 b确保Person提供正确的equals和hashCode实现。