2017-05-18 19 views
1

ArrayList를 map (Object ID와 키 값으로 Object)에 삽입하려고합니다.12 번째 인덱스의 첫 번째 레코드를 삽입하는 Hashmap

첫 번째 삽입은 12 번째 색인에서 발생합니다.

HashMap의 기본 크기는 16이므로 첫 번째 인덱스에는 네 번째 레코드가 삽입됩니다 (인덱스가 마지막으로 16 번째를 의미 함).

주문이 잘못되었습니다.

LinkedHashMap도 시도해 보았습니다. 같은 결과가오고있다.

for (Type object: Objects) { 
     map.put(object.obj.getId() , object); 
    } 

는이 문제를 해결하기 위해 도와주세요 :

그리고 여기 내 코드입니다.

감사합니다.

+5

어떤 주문을 하시겠습니까? HashMap에는 순서가 없다? LinkedHashMap은 삽입 주문을 제공합니다. 키를 정렬하려면 TreeMap을 사용하십시오. – Eran

+0

@Eran지도에 6 개의 레코드를 삽입합니다. 삽입은 12 번째 색인부터 시작됩니다. (디버깅으로 보았습니다.)하지만 1 위부터 원합니다. –

+0

색인을 제어하지 않습니다 (적어도 직접적으로는). 인덱스는'hashCode'를 기반으로 결정됩니다. 그리고 어쨌든 색인에 신경 쓰지 않아야합니다. – Eran

답변

1

LinkedHashMap은 사용자가 찾고있는 것입니다.

HashMap과 완전히 같습니다. 단, 반복 할 때 삽입 순서로 항목이 표시됩니다.

1

지도는 인덱스 기반 액세스를위한 것이 아닙니다. map.get(index)과 같은 것은 없습니다. 다른 답변/의견에 설명 된대로 반복하면서 가능하다 모든 순서를 보존됩니다 : 당신은지도의 내부 상태에 대해 신경 안

for (Type object: Objects) { 
    map.put(object.obj.getId() , object); 
} 
for (Entry entry: map.entrySet()) { 
    // should be same order as inserted if LinkedHashMap is used 
} 

. 모든 계산은 API의 설명 된 동작입니다.

+0

하지만 여기에 삽입 자체가 문제가됩니다. 마지막 레코드가 처음에 삽입됩니다. –

+0

@SivaPasupathi 아니요, LinkedHashMap의 내부 데이터는 hastable의 일부 인덱스에이를 저장합니다. 그렇다고해서 이런 행동을한다는 ​​의미는 아닙니다. 라이브러리로의 디버깅을 중지하고 API 문서 읽기를 시작하십시오. 내 예제를 사용해 본다면 설명대로 정확하게 작동합니다. 12 번째 색인에 저장된 요소는 반복되면 처음으로 표시됩니다. –