如何从Java中的特定键值开始迭代HashMap?

时间:2016-11-19 06:14:02

标签: java hashmap iterator

有没有办法从特定的密钥开始在HashMap中迭代?

假设我的地图是:

Map map = new HashMap();
map.put(1,"A");
map.put(2,"B");
map.put(3,"B");
map.put(4,"B");
map.put(5,"F");
map.put(6,"Z");

我希望迭代从密钥2开始。

常规迭代涉及:

public static void printMap(Map map) {
    Iterator it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry)it.next();
            System.out.println(pair.getKey() + " = " + pair.getValue());
        }
}

但是如何从特定键开始迭代?

2 个答案:

答案 0 :(得分:7)

您的问题是基于对HashMap的误解。特别是,如果您从密钥2开始并迭代其余条目,则无保证您将获得包含密钥23的条目, 456 ...按此顺序或任何顺序。

HashMap的迭代顺序未定义,在大多数情况下是不可预测的。

但是......如果您使用了LinkedHashMapTreeMap并重复了条目,那么您将按照定义的顺序获取它们:

  • LinkedHashMap会(通常)以插入顺序提供条目
  • TreeMap将按键的比较顺序给出条目。

如果您使用LinkedHashMap,从给定密钥开始(按插入顺序)获取所有条目的方法是从开始迭代,直到您获得所需的密钥。例如:

public static void printMapFrom(LinkedHashMap<K, V> map, K from) {
    boolean found = false;
    for (Map<K, V>.Entry entry : map.entrySet()) {
        if (!found && !from.equals(entry.getKey())) {
            continue;
        }
        found = true;
        System.out.println(entry.getKey() + " = " + entry.getValue());
    }
}

如果您使用TreeMap,则执行此操作的方法是使用tailMap(key)来获取从键到结尾的条目子图。然后迭代子图。

public static void printMapFrom(SortedMap<K, V> map, K from) {
    for (Map<K, V>.Entry entry : map.tailMap(from).entrySet()) {
        System.out.println(entry.getKey() + " = " + entry.getValue());
    }
}

如果您实际上并不关心HashMap中的键的顺序是不确定的,那么您可以使用上面的LinkedHashMap版本,使用普通HashMap或{{1 }}

答案 1 :(得分:-1)

首先定义您的map Map<Integer, String> map = new LinkedHashMap<Integer,String>(); 然后你可以像这样使用

for(Map.Entry<Integer, String> entry: map.entrySet()){
    if(entry.getKey() == 1){
        continue;
    }
    System.out.println(entry.getKey() +" : "+ entry.getValue());
}