如何从地图中的列表中删除特定对象?

时间:2013-05-22 09:18:12

标签: java

我有一张如下所示的地图:HashMap<Person, List<Items>>。 我想删除列表中的一些项目,我要删除的特定项目存储在另一个列表中。我怎样才能以最有效的方式删除地图中与其他列表中的项目匹配的列表项?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

这应该有用。

答案 2 :(得分:1)

以下是一个展示您情况的完整示例。请注意,hashcode and equals类已实施Item。这很重要,因为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());
                }
            }
        }
    }