我有一张看起来像这样的地图:HashMap<Person, List<Items>>
。 我想删除列表中的一些项目,我想删除的具体项目存储在另一个列表中。我怎样才能以最有效的方式去除地图上与其他列表中的项目相匹配的列表项?如何从地图列表中删除特定对象?
1
A
回答
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());
}
}
}
}
+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);
}
这应该有效。
相关问题
- 1. 从列表中删除特定对象
- 2. 如何从列表中删除特定的对象<T>
- 3. 如何从列表中删除对象
- 4. 从阵列列表中删除特定对象
- 5. 从对象列表中删除对象
- 6. 从列表中删除特定的对象(C++)
- 7. 从矢量列表中删除特定对象
- 8. 从db中删除一个特定的列表对象
- 9. 保持对象的地图从列表中删除它
- 10. 删除图例中的特定对象
- 11. 删除对象从列表
- 12. 从Parse.com中删除特定对象
- 13. Python:从对象中删除特定行
- 14. 如何从地图中删除对象/实例后从内存中删除?
- 15. 如何从绑定源中删除对象不影响列表中的对象
- 16. 如何从对象数组中删除特定对象,按对象的属性?
- 17. 如何从Java中的ArrayList中删除特定的对象?
- 18. 从列表中删除特定名称
- 19. 如何从本地存储中的阵列中删除对象?
- 20. 从列表中删除对象
- 21. 无法从列表中删除对象
- 22. 从C++列表中删除对象
- 23. 从列表中删除对象
- 24. 如何从本地存储阵列中删除特定项目?
- 25. 如何从ConcurrentBag <>中删除单个特定对象?
- 26. 如何从JavaScript对象数组中删除特定的元素?
- 27. 如何从TableView中删除特定的核心数据对象
- 28. 如何使用Javascript或Lodash从arrayList中删除特定对象
- 29. 从地图中删除中介对象\t对象
- 30. 如何从Hive地图类型中删除特定的键?
遍历所有的键在一个地图,然后使用从列表中removeAll方法。 – Damian0o