如何从HashMap的位置检索元素,这有可能吗?
如何从HashMap的位置检索元素,这有可能吗?
Answers:
使用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);
如果要维持将元素添加到地图的顺序,请使用LinkedHashMap
而不是just HashMap
。
这是一种允许您通过映射中的索引获取值的方法:
public Object getElementByIndex(LinkedHashMap map,int index){
return map.get( (map.keySet().toArray())[ index ] );
}
如果由于某种原因必须坚持使用hashMap,则可以将keySet转换为数组,然后对数组中的键进行索引以获取映射中的值,如下所示:
Object[] keys = map.keySet().toArray();
然后,您可以像这样访问地图:
map.get(keys[i]);
String myKey = keys[i].toString();
使用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;
}
该函数可以返回所选的条目。
另一种工作方法是将映射值转换为数组,然后在索引处检索元素。使用以下方法在10万个对象的LinkedHashMap中通过索引搜索对10万个元素进行测试运行,得出以下结果:
//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);
您可以尝试实现类似的方法,请看:
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
希望这对您有用。