Java Arraylist-将一个文件复制到另一个文件而不复制
我有一个Java Arraylist-将一个文件复制到另一个文件而不复制,java,arraylist,Java,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<Person> list2 = new ArrayList<Person>(); list2.add(ne
数组列表
:
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<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
有两个值为2和0的“John”条目。我想从此列表中删除值为0的条目。创建一个比较器,仅按名称对它们进行比较(如果您还没有执行此操作的equals())
按个人价值的递减顺序排列列表(考虑到价值是正的,是吗?)
然后,基于这个比较器创建一个集合。现在您可以调用addAll 在您的示例中,从名称到数字的映射似乎是更合适的数据结构。使用这些地图,您只需执行以下操作:
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());
}
}
for(Map.Entry e:map2.entrySet()){
整数v=map1.get(e.getKey());
如果(v==null | | v
订单重要吗?如果不是,则集合
比列表
更有意义<代码>集合在程序员考虑数组的时候一直没有得到充分利用
如果顺序不重要,那么一种相当粗糙的方法就是使用带有自定义比较器的
TreeSet
。或者,使用Map
(可能是LinkedHashMap
)。在我看来,你真正想要的是一张地图。创建其中一个,并为任一列表中的每个人将值0放入映射中,并将该人的姓名作为键。现在,对于每个列表中的每个人,从地图中获取人名的值,将该人的值添加到地图中,然后将结果存储回地图。现在,如果您在ArrayList中确实需要它,那么从映射中将键值对提取到一个新列表中就很简单了。嗯,在您的程序逻辑中,这听起来像是创建了一个
new Person("John", 2)
这不是你想要的——真的有一个叫约翰的“新人”吗?还是有新分数的老约翰?也许你需要一个函数来更新个人的分数,比如
Person.setValue(int)
很抱歉,如果这不能真正回答您的问题,那么检查您是否拥有正确的数据结构是非常重要的。似乎您想要每个用户的最大值:
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());
List all=new ArrayList();
all.addAll(列表1);
all.addAll(列表2);
Map Map=newhashmap();
对于(个人p:全部){
if(!map.containsKey(p.name)| map.get(p.name).num
那么
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() );
ArrayList list3=新建ArrayList();
列表3.addAll(列表1);
列表3.addAll(列表2);
系统输出打印项次(“之前”);
for(个人:列表3)
System.out.println(person.getName()+“=”+person.getIntParam());
过滤人员(列表3);
System.out.println(“之后”);
for(个人:列表3)
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-- );
}
}
publicstaticvoidfilterPeople(列出人员){
for(inti=0;i
使用地图听起来是最好的选择,一套也可以。
请务必让Person提供适当的equals和hashCode实现。这是怎么回事
亲自上课:
@Override
public boolean equals(Object obj) {
Person o = (Person) obj;
if (o.getNombre().equals(this.nombre)) {
return true;
}
return false;
}
然后:
list2.addAll(list1);
最终ArrayList list3=list2;
CollectionUtils.filter(列表2,新谓词(){
公共布尔求值(对象arg0){
if(((Person)arg0.getId()==0&&CollectionUtils.cardinality(arg0,list3)>1){
返回false;
}否则{
返回true;
}
}
});
不能使用集合删除DUP吗?只要Person对象具有良好的equals和hashCode覆盖方法,就可以使用集合删除DUP。你会发现一些人对性能争论不休,但我的意思是,你必须在某个地方进行性能测试,因为你必须循环所有记录。您也可以让Java来为您做。@Harish-如果两个值都不是零,该怎么办?我想他只想删除值为0
的重复项,而不是所有值为0
的项。CollectionUtils
是标准Java吗?它是从哪里来的,apache?@Alex-这是如何检查哪个条目的值不是零值的?不确定这是否是最好的解决方案,但它对我有效。谢谢Richard这取决于我对你所做的假设是否正确。您想要最大值吗?
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;
}
}
});