我有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的条目。
答案 0 :(得分:8)
听起来,在您的程序逻辑中,创建一个
new Person("John", 2)
不是你想要的 - 是否真的有一个叫做John的“新人”?或者是具有新分数的相同的旧约翰?也许您需要一个功能来更新个人的分数,如
Person.setValue(int)
很抱歉,如果这实际上没有回答您的问题,但检查您是否拥有正确的数据结构非常重要。
答案 1 :(得分:2)
订单重要吗?如果没有,则Set
比List
更有意义。 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实现。