2012-03-08 7 views
2

나는 친구와 비디오 게임을하고있다. 다른 유형의 항목을 설명하기 위해 원래 Item 클래스를 확장하는 각 항목에 대한 클래스를 가졌습니다. 이 수업에는 많은 데이터가 없었기 때문에 대안 공간을 찾고 있었고 작업 공간이 너무 어수선하지 않았습니다. 나는 HashMaps에 대해 배우기 시작했고, 그들이 항목을 추가하는 멋진 방법이라고 생각했습니다. 또한 기본적으로 ArrayList로 만들 수있는 int를 사용하여 HashMap의 항목에 액세스하는 대신 String으로 액세스 할 수 있도록 설정할 수도 있습니다. 그래서이 기능을 추가하여 아이템 클래스에 익명의 아이템을 생성하기 시작했습니다.목록에서 항목에 액세스하고 복사하는 방법으로 HashMap을 사용하려면 어떻게해야합니까?

private static Item coal = new Item() { 
     weight = .2; 
     setImageID(0, 16); 
    } 

그리고 이들을 HashMap에 추가하기 시작했습니다.

itemMap.put("Coal", coal); 

이 몇 일 후, 나는이 목록의 각 유형의 하나 개의 항목 만 있다는 것을 깨닫고 우리가 이제까지 원본을 수정하지 않고 수정 될 수있는 해당 항목의 배수를하기를 원한다면, 우리 사본을 만들어야합니다. 나는 그것을하는 방법에 대한 연구를 시작했다. 복사 생성자를 사용할 수는 있지만 효율적으로 수행하려면 항목에 너무 많은 변수가 있습니다. 우리는 확실히 그것을 할 수 있었지만 간단한 해결책이 있는지 궁금해하고있었습니다. 우리는 모든 항목을 최종적으로 만들 수 있습니까? 나는이 분야의 프로그래밍에 완전히 익숙하지 않기 때문에 단지 뱉어 낼 뿐이었다. 이 모든 일을 잘못했을 수도 있습니다. 난 단지 HashMap을 사용하여 목록의 항목을 무기한으로 액세스하는 데 사용할 수있는 "항목 데이터베이스"를 만드는 방법이 필요합니다. 어떤 제안?

답변

5

집합의 값을 가진 HashMap (또는 동일한 항목이 두 번 이상 존재할 수있는 지에 따라 목록)은 어떻습니까?

Map<String, Set<Item>> map = new HashMap<String, Set<Item>>(); 

그런 식으로 각 유형에 대해 여러 항목을 가질 수 있습니다. 유형의 세트에 새 항목을 추가하는

하나의 관용구는 다음과 같습니다 :

Set<Item> items = map.get(type); 
if (items == null) { 
    items = new HashSet<Item>(); 
    items.put(type, items); 
} 
items.add(item); 

심지어 당신의 유형에 대한 Enum를 사용하는 대신 단지 문자열에 대한 나쁜 생각하지 않을 수 있습니다. 그런 다음 map.put(Item.COAL, itemSet);과 같은 작업을 수행 할 수 있습니다. 그러면 오타 및 대소 문자 구분 문제를 방지하는 데 도움이됩니다.

0

Hashmap<string,ArrayList<Item>>이 아마도 작동할까요? itemMap.put("Coal", coal) 대신 itemMap.get ("Coal")에 이미 배열 목록이 있는지 확인하고 새 항목을 목록에 추가해야합니다.

0

당신이이 같은 문장으로지도를 지정할 수 있습니다 알고 계십니까 :

HashMap<Integer, Item[]> map = new HashMap<Integer, Item[]>(); 

또는

HashMap<String, Item[]> map = new HashMap<String, Item[]>(); 

을 위해 일할 수있는 정수 또는 문자열 항목의 각 세트/배열/목록을 연관하여 문제.

0

올바르게 이해한다면 각 HashMap 안에있는 모든 항목의 목록을 가져와 항목 유형 아래의 여러 항목에 액세스해야합니다. 이렇게하려면 HashMap<String, ArrayList<Item>>을 만드십시오. 항목 유형을 처음 만들 때 새로운 ArrayList<Item>을 만들고 동일한 항목 유형의 후속 항목을 추가 할 때 목록에 추가하면됩니다.

그러나 HashMap은 그다지 효율적이지 않습니다.알려진 수량의 항목 유형이있는 경우 해당 항목 유형의 수와 동일한 initialCapacity로 외부 ArrayList를 초기화하고 항목 유형의 이름을 색인으로 변환하는 메소드를 가질 수 있도록 ArrayList<ArrayList<Item>>으로 만듭니다. 로드 인자가 부족하여 더 많은 메모리를 효율적으로 사용할 수 있도록 외부 ArrayList에 저장되고 해시 함수의 오버 헤드를 우회합니다. 항목 이름을 색인으로 변환하는 방법 대신 항목 유형을 항목 유형에 각각 추가 할 수 있습니다.

그래서 당신은 할 것이다 :

class Coal { 
    public int id = 0 
} 

하여 외부의 ArrayList가 itemTypes 이름과 항목이 coal입니다 가정하면, 간단하게 될 것이다 추가 :

itemTypes.get(coal.id).add(coal) 

사용하고자하는 구현에 당신의 전화 , HashMap은 성능이 떨어지면서 메모리 사용량이 증가함에 따라 작성하는 코드가 더 간단하고 코드가 적습니다.

관련 문제