[英]Copy one item from an ArrayList to another ArrayList Java 8
[英]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)
很抱歉,如果这实际上没有回答您的问题,但检查您是否拥有正确的数据结构非常重要。
订单重要吗? 如果没有,则Set
比List
更有意义。 从历史上看, 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.