Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在没有entrySet的情况下迭代HashMap_Java - Fatal编程技术网

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

Java 如何在没有entrySet的情况下迭代HashMap,java,Java,在原始java源代码中,我必须使用entrySet迭代hashmap,例如: for (Map.Entry<String, String> e : new Hash<String, String>().entrySet()) { } for(Map.Entry e:new Hash().entrySet()){ } 我希望有一种更简单的方法来迭代hashmap,如下所示: package ro.ex; import java.util.HashMap; impo

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

 for (Map.Entry<String, String> e : new Hash<String, String>().entrySet()) {
 }
for(Map.Entry e:new Hash().entrySet()){
}
我希望有一种更简单的方法来迭代hashmap,如下所示:

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>()) {
        }
    }
}
包装ro.ex;
导入java.util.HashMap;
导入java.util.Map;
类哈希扩展了HashMap{
//如何实施?
}
公共类Ex2{
公共静态void main(字符串[]args){
//我想
for(Hash.Entry e:new Hash()){
}
}
}
我的问题是如何实现它?

实现
Iterable

类哈希扩展HashMap实现Iterable{
@凌驾
公共迭代器迭代器(){
返回entrySet().iterator();
}
}

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

作为@August答案的补充,虽然使
映射像这样直接可编辑并不困难,但这也不是一个好主意

  • 您引入了一个新的
    Hash
    类,它不提供任何实质性的新功能。这真的只是一个方便的课程。额外的类意味着需要读取和维护更多的类,以及更大的运行时占用空间

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

  • 您的
    Hash
    类可以说是不直观的。
    映射有三个(至少)方面可以迭代,但您选择了一个。。。原因通常不明显。(这就是为什么标准的
    Map
    API没有实现
    Iterable
    !!)

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

现在这些东西都不是“表演的阻碍”。。。但另一方面,您所取得的成就是在
for
循环中保存约10个字符



1-作为原始作者,这对你来说可能不是问题。但是,如果有人第一次遇到您的
Hash
类,则必须阅读源代码或javadoc,以了解迭代的真正含义……

从Java 8开始,迭代HashMap的最佳且最简单的方法是使用Lambda表达式。下面是要

Map Map=newhashmap();
普特地图(“罗伯特”,34岁);
普特地图(“基兰”,29);
地图。放置(“安迪”,44岁);
map.forEach((键,值)->{
系统输出打印项次(键);
System.out.println(值);});

entryset不是遍历映射的唯一方法。。。您可以使用键集、值或获取键的内部变量等。通过“更简单的方式”,您的意思是“无需键入
.entrySet()
”?
class Hash<K, V> extends HashMap<K, V> implements Iterable<Map.Entry<K, V>> {
    @Override
    public Iterator<Entry<K, V>> iterator() {
        return entrySet().iterator();
    }
}
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);});