2013-05-22 3 views
1

다음과 같은지도가 있습니다 : HashMap<Person, List<Items>>. 목록에서 몇 가지 항목을 제거하고 싶습니다. 제거하려는 특정 항목은 다른 목록에 저장됩니다. 가장 효율적인 방법으로 다른 목록의 항목과 일치하는지도의 목록 항목을 어떻게 제거 할 수 있습니까?지도의 목록에서 특정 개체를 제거하는 방법은 무엇입니까?

+2

반복 처리 후 사용 리스트로부터 removeAll 메소드를 취득합니다. – Damian0o

답변

1

다음은 상황을 설명하는 전체 예제입니다. hashcode and equalsItem 클래스에 구현되었습니다. 이는 제공된 항목 목록이 소유 항목 목록과 동일한 지 여부를 확인하기 위해 removeAll 메서드에서 equals를 사용하기 때문에 중요합니다. 지도에서 모든 키를 통해

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)을 제공합니다.

ArrayList에 대한 O (1) 연산 대 O (n) 요소이므로,이 시나리오에서는 LinkedList을 사용하는 것이 좋습니다.

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

이렇게하면됩니다.

관련 문제