2013-05-22 63 views
1

我有一张看起来像这样的地图:HashMap<Person, List<Items>>。 我想删除列表中的一些项目,我想删除的具体项目存储在另一个列表中。我怎样才能以最有效的方式去除地图上与其他列表中的项目相匹配的列表项?如何从地图列表中删除特定对象?

+2

遍历所有的键在一个地图,然后使用从列表中removeAll方法。 – Damian0o

回答

1

下面是一个演示您的情况的完整示例。请注意,hashcode and equalsItem类中实现。这很重要,因为它等于removeAll方法将用于确定提供的项目列表是否等于拥有的项目列表。

Item.java

public class Item { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Item(String name) { 
     super(); 
     this.name = name; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Item other = (Item) obj; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     return true; 
    } 


} 

Person.java

public class Person { 

    private String name; 


    public Person(String name) { 
     super(); 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

应用

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 


    public class StackTest { 
     public static void main(String[] args) { 
      Person person = new Person("Logan"); 
      Person person2 = new Person("Jean"); 
      Person person3 = new Person("Gambit"); 
      Person person4 = new Person("Storm"); 

      Item item1 = new Item("Claws"); 
      Item item2 = new Item("Jacket"); 
      Item item3 = new Item("Cards"); 
      Item item4 = new Item("Cape"); 

      List<Item> items = new ArrayList<Item>(); 
      items.add(item1); 
      items.add(item2); 
      items.add(item3); 
      items.add(item4); 

      List<Item> loganItems = new ArrayList<Item>(items); 
      List<Item> jeanItems = new ArrayList<Item>(items); 
      List<Item> gambitItems = new ArrayList<Item>(items); 
      List<Item> stormItems = new ArrayList<Item>(items); 

      Map<Person, List<Item>> people = new HashMap<Person,List<Item>>(); 
      people.put(person, loganItems); 
      people.put(person2, jeanItems); 
      people.put(person3, gambitItems); 
      people.put(person4, stormItems); 

      printMap(people); 

      List<Item> removeItems = new ArrayList<Item>(); 
      Item rItem1 = new Item("Cards"); 
      Item rItem2 = new Item("Jacket"); 
      removeItems.add(rItem1); 
      removeItems.add(rItem2); 

      removeItem(people, person, removeItems); 

      printMap(people); 

     } 

     public static void removeItem(Map<Person,List<Item>> map, Person p, List<Item> items){ 
      map.get(p).removeAll(items); 
     } 

     public static void printMap(Map<Person, List<Item>> map){ 
      for(Entry<Person,List<Item>> entry:map.entrySet()){ 
       System.out.println(entry.getKey().getName() + " items:"); 
       for(Item item: entry.getValue()){ 
        System.out.println(item.getName()); 
       } 
      } 
     } 
    } 
+0

非常感谢这个全面的答案!用equals和hashcode挣扎了一下,但现在它的工作正常:) – amph

1

列表已经提供了一个方法:List.removeAll(Collection<?> collection)

当然,在这种情况下使用LinkedList可能更可取,因为对于ArrayList,删除元素是O(1)操作而不是O(n)操作。

1
HashMap<Person, List<Items>> map = // Your map 
for(Person p:map.keySet()) { 
    map.get(p).removeAll(removeList); 
} 

这应该有效。