如何在没有entrySet的情况下迭代HashMap

时间:2014-12-06 03:56:44

标签: java

在原始java源代码中,我必须使用entrySet来迭代一个hashmap,例如:

 for (Map.Entry<String, String> e : new Hash<String, String>().entrySet()) {
 }

我希望有一种更简单的方法来迭代如下的散列图:

package ro.ex;

import java.util.HashMap;
import java.util.Map;

class Hash<K, V> extends HashMap<K, V> {
    // how to implement?
}

public class Ex2 {
    public static void main(String[] args) {
        // i expect

        for (Hash.Entry<String, String > e : new Hash<String, String>()) {
        }
    }
}

我的问题是如何实现它?

3 个答案:

答案 0 :(得分:2)

实施Iterable<Map.Entry<K, V>>

class Hash<K, V> extends HashMap<K, V> implements Iterable<Map.Entry<K, V>> {
    @Override
    public Iterator<Entry<K, V>> iterator() {
        return entrySet().iterator();
    }
}

这是有效的,因为实现Iterable允许在for-each循环中使用该类型。

答案 1 :(得分:2)

作为@ August的答案的补充,虽然让Map直接迭代这样并不困难,但也不是一个好主意

  • 您已经引入了一个新的Hash类,它没有提供实质性的新功能。这真的只是一个便利课程。额外的类意味着更多的类来阅读 1 并维护更大的运行时间。

  • 为了使用您的Hash类,您的其他代码需要编码到Hash类而不是Map接口。这使得无法使用不同的Map实现类型直接替换地图。

  • 您的Hash课程可能不直观。 Map有三个(至少)方面可以迭代,但是您选择了一个......原因通常不明显。 (这就是标准Map API未实现Iterable的原因!!)

  • 定义HashMap的子类时,可以防止JIT编译器在某些情况下优化某些方法调用的调度。

现在这些东西都不是“塞子”#34; ...但另一方面,你所取得的成就是在for循环中保存~10个字符。


1 - 作为原始作者,这对您来说可能不是问题。但是第一次遇到你的Hash类的其他人必须阅读源代码或者javadoc以找出迭代它真正意味着什么......

答案 2 :(得分:0)

从Java 8开始,迭代HashMap的最佳和最简便方法是使用Lambda表达式。以下是iterate HashMap的代码段,

Map<String,Integer> map = new HashMap<String,Integer>(); 

map.put("Robert", 34);
map.put("Kiran", 29);
map.put("Andy", 44);

map.forEach((key,value) -> {
System.out.println(key);
System.out.println(value);});