过滤掉ArrayList中的对象

时间:2011-08-02 18:28:17

标签: java

我有一个Foo对象的ArrayList。 Foo的属性是String name和int age。 我不希望有多个同名,所以当同名时,只保留最大的年龄。 我正在寻找让我使用Java的想法。

3 个答案:

答案 0 :(得分:2)

  1. 创建一个Hashtable来跟踪您遇到的当前最大年龄的Foo。
  2. 遍历您的ArrayList。对于每个Foo:
    1. 如果Hashtable不包含具有给定名称的项目,请添加名称为该项目的项目。
    2. 如果Hashtable包含具有给定名称的Foo,请检查其年龄。
      1. 如果当前Foo的年龄大于Hashtable中Foo的年龄,请将Hashtable中的Foo替换为您正在查看的Foo。

答案 1 :(得分:0)

ArrayList<Foo>中的每个(姓名,年龄)对放入HashMap<String,Foo>。如果HashMap已包含具有相同名称的密钥,则比较年龄并相应地替换。

完成后,将ArrayList中的元素替换为HashMap中的元素。

HashMap<String,Foo> hashmap = new HashMap<String,Foo>();

for( Foo foo : arraylist ) {
    if( !hashmap.contains( foo.name ) || hashmap.get( foo.name ).age < foo.age )
        hashmap.put( foo.name, foo );
}

arraylist.clear();

for( String name : hashmap.keySet() ) {
    arraylist.add( hashmap.get( name ) );
}

答案 2 :(得分:0)

Map<String , Foo> foos = new HashMap<String , Foo>();
for ( Foo foo : listFoos ) {
   Foo currentFoo = foos.get(foo.getName());
   if ( currentFoo == null ) {
         foos.add(foo.getName(), foo);
         continue;
   }
   if ( currentFoo.getAge() > foo.getAge() ) 
       continue;
   foos.put(foo.getName() , foo);
}

在Foo上实现equals和hashCode()以使用name属性。