위치별로 HashMap에서 요소를 검색하는 방법은 무엇입니까?
위치별로 HashMap에서 요소를 검색하는 방법은 무엇입니까?
답변:
HashMaps 는 순서를 유지하지 않습니다.
이 클래스는지도의 순서를 보장하지 않습니다. 특히 주문이 시간이 지나도 일정하게 유지된다는 보장은 없습니다.
예측 가능한 반복 순서를 보장하는 LinkedHashMap을 살펴보십시오 .
LinkedHashMap을 사용하고 위치별로 검색해야하는 경우 값을 ArrayList로 변환합니다.
LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>();
/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");
/* Get by position */
int pos = 1;
String value = (new ArrayList<String>(linkedHashMap.values())).get(pos);
어떤 이유로 hashMap을 고수해야하는 경우 keySet을 배열로 변환하고 배열의 키를 인덱싱하여 다음과 같이 맵에서 값을 가져올 수 있습니다.
Object[] keys = map.keySet().toArray();
그런 다음 다음과 같이지도에 액세스 할 수 있습니다.
map.get(keys[i]);
String myKey = keys[i].toString();
사용 LinkedHashMap
:
예측 가능한 반복 순서와 함께 Map 인터페이스의 해시 테이블 및 연결 목록 구현. 이 구현은 모든 항목을 통해 실행되는 이중 링크 목록을 유지한다는 점에서 HashMap과 다릅니다.
LinkedHashMap을 사용하고이 함수를 사용하십시오.
private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
이렇게 정의하고.
private Entry getEntry(int id){
Iterator iterator = map.entrySet().iterator();
int n = 0;
while(iterator.hasNext()){
Entry entry = (Entry) iterator.next();
if(n == id){
return entry;
}
n ++;
}
return null;
}
이 함수는 선택한 항목을 반환 할 수 있습니다.
또 다른 작업 방법은 맵 값을 배열로 변환 한 다음 인덱스에서 요소를 검색하는 것입니다. LinkedHashMap에서 다음 접근 방식을 사용하여 100,000 개의 개체에 대한 인덱스 검색을 통해 100,000 개의 요소를 테스트하면 다음과 같은 결과가 나타납니다.
//My answer:
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){
return map.values().toArray(new Particle[map.values().size()])[index];
} //68 965 ms
//Syd Lambert's answer:
public Particle getElementByIndex(LinkedHashMap<Point, Particle> map,int index){
return map.get( (map.keySet().toArray())[ index ] );
} //80 700 ms
LinkedHashMap에서 인덱스로 요소를 검색하는 것은 모두 상당히 무거운 작업 인 것 같습니다.
기본적으로 java LinkedHasMap은 위치 별 값 가져 오기를 지원하지 않습니다. 그래서 나는 맞춤형으로 이동하는 것이 좋습니다.IndexedLinkedHashMap
public class IndexedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
private ArrayList<K> keysList = new ArrayList<>();
public void add(K key, V val) {
super.put(key, val);
keysList.add(key);
}
public void update(K key, V val) {
super.put(key, val);
}
public void removeItemByKey(K key) {
super.remove(key);
keysList.remove(key);
}
public void removeItemByIndex(int index) {
super.remove(keysList.get(index));
keysList.remove(index);
}
public V getItemByIndex(int i) {
return (V) super.get(keysList.get(i));
}
public int getIndexByKey(K key) {
return keysList.indexOf(key);
}
}
그런 다음이 사용자 지정 LinkedHasMap을 다음과 같이 사용할 수 있습니다.
IndexedLinkedHashMap<String,UserModel> indexedLinkedHashMap=new IndexedLinkedHashMap<>();
가치를 추가하려면
indexedLinkedHashMap.add("key1",UserModel);
인덱스로 값을 얻으려면
indexedLinkedHashMap.getItemByIndex(position);
HashMaps는 위치 별 액세스를 허용하지 않으며 해시 코드에 대해서만 알고 있으며 키의 해시 코드를 계산할 수 있으면 값을 검색 할 수 있습니다. TreeMap에는 정렬 개념이 있습니다. Linkedhas 맵은 맵에 들어간 순서를 유지합니다.
다음과 같은 것을 구현해 볼 수 있습니다.
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("juan", 2);
map.put("pedro", 3);
map.put("pablo", 5);
map.put("iphoncio",9)
List<String> indexes = new ArrayList<String>(map.keySet()); // <== Parse
System.out.println(indexes.indexOf("juan")); // ==> 0
System.out.println(indexes.indexOf("iphoncio")); // ==> 3
이것이 당신에게 효과가 있기를 바랍니다.