繁体   English   中英

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

[英]Java Arraylist - Copy one to another without duplicates

我有一个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。

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

new Person("John", 2)

不是你想要的 - 是不是真的有一个叫做约翰的“新人”? 或者是具有新分数的约翰? 也许你需要一个功能来更新个人喜欢的分数

Person.setValue(int)

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

订单重要吗? 如果没有,则SetList更有意义。 从历史上看, Set在数组方面的思考程度不高。

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

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

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

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

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

按照人的价值的低位顺序排列清单(考虑到价值是正的。是吗?)

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

从您的示例中可以看出,Map从name到whatever-the-number-means是更合适的数据结构。 有了这样的地图,你只需:

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

那这个呢?

在人类:

@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;
            }
        }
    });

关于什么...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM