我正在尝试使用HashMap将唯一字符串映射到字符串ArrayList,如下所示:
HashMap<String, ArrayList<String>>
基本上,我希望能够通过编号访问密钥,而不是使用密钥的名称。我希望能够访问所述密钥的值,迭代它。我想象的是这样的事情:
for(all keys in my hashmap) {
for(int i=0; i < myhashmap.currentKey.getValue.size(); i++) {
// do things with the hashmaps elements
}
}
有一种简单的方法吗?
答案 0 :(得分:60)
如果你真的只想要第一个键值
,这是一般解决方案Object firstKey = myHashMap.keySet().toArray()[0];
Object valueForFirstKey = myHashMap.get(firstKey);
答案 1 :(得分:31)
您可以通过调用map.keySet()
来迭代密钥,或者通过调用map.entrySet()
来迭代条目。迭代条目可能会更快。
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
List<String> list = entry.getValue();
// Do things with the list
}
如果您想确保以您插入的顺序迭代键,请使用LinkedHashMap
。
顺便说一句,我建议将地图的声明类型更改为<String, List<String>>
。总是最好根据接口而不是实现来声明类型。
答案 2 :(得分:8)
除非您使用LinkedHashMap
或SortedMap
,否则不会对HashMaps进行排序。在这种情况下,您可能需要LinkedHashMap
。这将按插入顺序迭代(或者如果您愿意,按照上次访问的顺序)。在这种情况下,它将是
int index = 0;
for ( Map.Entry<String,ArrayList<String>> e : myHashMap.iterator().entrySet() ) {
String key = e.getKey();
ArrayList<String> val = e.getValue();
index++;
}
地图中没有直接获取(索引),因为它是键/值对的无序列表。 LinkedHashMap
是保持订单的特殊情况。
答案 3 :(得分:2)
for (Object key : data.keySet()) {
String lKey = (String) key;
List<String> list = data.get(key);
}
答案 4 :(得分:2)
已选择解决方案。但是,我为那些想要使用替代方法的人发布了这个解决方案:
// use LinkedHashMap if you want to read values from the hashmap in the same order as you put them into it
private ArrayList<String> getMapValueAt(LinkedHashMap<String, ArrayList<String>> hashMap, int index)
{
Map.Entry<String, ArrayList<String>> entry = (Map.Entry<String, ArrayList<String>>) hashMap.entrySet().toArray()[index];
return entry.getValue();
}
答案 5 :(得分:2)
我遇到了同样的问题,从不同的相关问题中读了几个答案,并提出了自己的课程。
public class IndexableMap<K, V> extends HashMap<K, V> {
private LinkedList<K> keyList = new LinkedList<>();
@Override
public V put(K key, V value) {
if (!keyList.contains(key))
keyList.add(key);
return super.put(key, value);
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
for (Entry<? extends K, ? extends V> entry : m.entrySet()) {
put(entry.getKey(), entry.getValue());
}
}
@Override
public void clear() {
keyList.clear();
super.clear();
}
public List<K> getKeys() {
return keyList;
}
public int getKeyIndex(K key) {
return keyList.indexOf(key);
}
public K getKeyAt(int index) {
if (keyList.size() > index)
return keyList.get(index);
return null;
}
public V getValueAt(int index) {
K key = getKeyAt(index);
if (key != null)
return get(key);
return null;
}
}
示例(为清晰起见,类型与OPs问题有所不同)
Map<String, Double> myMap = new IndexableMap<>();
List<String> keys = myMap.getKeys();
int keyIndex = myMap.getKeyIndex("keyString");
String key = myMap.getKeyAt(2);
Double value myMap.getValueAt(2);
请记住,它不会覆盖任何复杂的方法,因此,如果您要可靠地访问其中一种方法,则需要自己进行操作。
编辑:我对putAll()方法进行了更改,因为旧的方法极少有机会导致HashMap和LinkedList处于不同的状态。
答案 6 :(得分:1)
你可以这样做:
for(String key: hashMap.keySet()){
for(String value: hashMap.get(key)) {
// use the value here
}
}
这将迭代每个键,然后列表中每个键与每个键相关联。
答案 7 :(得分:0)
HashMaps不会按特定顺序保留您的键/值对。它们是根据每个键从Object.hashCode()方法返回的哈希值排序的。但是,您可以使用迭代器迭代一组键/值对:
for (String key : hashmap.keySet())
{
for (list : hashmap.get(key))
{
//list.toString()
}
}
答案 8 :(得分:0)
如果您不关心实际的密钥,那么迭代所有 Map的值的简明方法是使用其values()
方法
Map<String, List<String>> myMap;
for ( List<String> stringList : myMap.values() ) {
for ( String myString : stringList ) {
// process the string here
}
}
values()
方法是Map接口的一部分,并返回地图中值的Collection视图。
答案 9 :(得分:0)
您可以使用Kotlin扩展功能
fun LinkedHashMap<String, String>.getKeyByPosition(position: Int) =
this.keys.toTypedArray()[position]
fun LinkedHashMap<String, String>.getValueByPosition(position: Int) =
this.values.toTypedArray()[position]
答案 10 :(得分:0)
例如,您需要像这样创建多个 HashMap
display: none
答案 11 :(得分:0)
Kotlin HashMap 答案
可以通过索引获取key。然后通过key获取value。
val item = HashMap<String, String>() // Dummy HashMap.
val keyByIndex = item.keys.elementAt(0) // Get key by index. I selected "0".
val valueOfElement = item.getValue(keyByIndex) // Get value.