我有一张看起来像这样的地图:HashMap<Person, List<Items>>
. 我想删除列表中的一些项目,我要删除的特定项目存储在另一个列表中。如何以最有效的方式删除地图中与其他列表中的项目匹配的列表项?
问问题
341 次
3 回答
1
这是一个展示您的情况的完整示例。注意hashcode and equals
在Item
类上实现。这很重要,因为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 回答