2010-01-03 1 views
0

나는 ArrayList 그럼 내가 그 속성 백 등으로의 ArrayList를 작성검색 데이터는

class Attribute{ 
    private int id; 
    public string getID(){ 
    return this.id; 
    } 

    private string value; 
    public string getValue(){ 
    return this.value; 
    } 

    //... more properties here... 
} 

Attributes를 포함합니다. 그리고 정의 된 ID로 Attribute를 찾고 싶습니다. 나는 이런 식으로하고 싶다.

ArrayList<Attribute> arr = new ArrayList<Attribute>(); 
fillList(arr); //Method that puts a lot of these Attributes in the list 
arr.find(234); //Find the attribute with the ID 234; 

유일한 해결책은 ArrayList를 반복하는 것이다.

답변

5

무언가의 배열 목록을 반복해야합니다. 이것을 수행하는 다양한 방법이 있습니다.

정렬 된 방법으로 배열을 채우면 (예 : 낮은 ID가 항상 높은 ID보다 먼저 오도록) O (로그 N)에서 이진 검색을 수행 할 수 있습니다. 시각. 그렇지 않으면 O (N)이됩니다.

ID로 많은 검색을 수행하려는 경우 Map<Integer, Attribute>으로 시작해야합니다. 예 : 주문을 보존하려면 HashMap 또는 LinkedHashMap?

그러나 하나의 ID (또는 몇 개) 만 검색하려는 경우에는 거의 가치가 없을 것입니다. 결국 해싱에 소요되는 비용이 있습니다. 지도를 채우는 것은 목록을 작성하는 것보다 비용이 많이 들고 차이점은 저장된 ID보다 몇 배 더 큰 ID를 찾는 것보다 큽니다.

성능 병목 현상이 있습니까? 그렇다면 맵을 사용하여 쉽게 개선 할 수 있습니다 (또는 바이너리 검색과 함께 정렬 된 목록). 그렇지 않다면지도보다 자연스럽게 목록을 사용하는 경우 코드를 방해하지 않을 것입니다.하지만 병목 상태인지 여부를 확인해야합니다.

+0

감사합니다. 네, 해시 맵의 거의 모든 속성을 조회해야합니다. 그리고 아직 모든 코드를 작성하지 않았습니다. 그래서 나는 그것을 많이 바꿔도 괜찮습니다. 나는 단지 배우기를 원합니다. 감사합니다. –

1

당신은 당신이 요소 속성을 사용하여 컬렉션의 요소에 액세스하려면,이 속성이 요소마다 고유 보장되는 경우에 당신이 정말지도를 사용해야하는 Map

1

를 사용하고 싶습니다. Attribute.id를 키로 사용하여 Map을 시도하십시오.