Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Arraylist-将一个文件复制到另一个文件而不复制_Java_Arraylist - Fatal编程技术网

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