1

我有一张看起来像这样的地图:HashMap<Person, List<Items>>. 我想删除列表中的一些项目,我要删除的特定项目存储在另一个列表中。如何以最有效的方式删除地图中与其他列表中的项目匹配的列表项?

4

3 回答 3

1

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

项目.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;
    }


}

人.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());
                }
            }
        }
    }
于 2013-05-22T09:51:09.110 回答
1

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

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

于 2013-05-22T09:21:42.023 回答
1
HashMap<Person, List<Items>> map = // Your map
for(Person p:map.keySet()) {
    map.get(p).removeAll(removeList);
}

这应该有效。

于 2013-05-22T09:21:46.850 回答