Map.Entry:如何使用它?

50 java collections dictionary hashmap

我正在创建一个计算器..我把我的按钮放在HashMap集合上,当我想将它们添加到扩展Jpanel的类时,我不知道如何从我的集合中获取按钮.所以我在网上发现了我的代码的最后两行,但我不知道它们的含义.

这是我的代码:

import java.awt.Component;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JPanel;


public class PanneauCalcul extends JPanel {

    private HashMap<String, JButton> listbouton = new HashMap<String, JButton>() ;

    public PanneauCalcul() {
        for(int i = 0; i < 10; i ++) {
            listbouton.put("num" + i, new JButton("" + i)) ;
        }

        listbouton.put("add", new JButton("+")) ;
        listbouton.put("soustract", new JButton("-")) ;
        listbouton.put("multiply", new JButton("x")) ;
        listbouton.put("divise", new JButton("/")) ;
        listbouton.put("equal", new JButton("=")) ;

        Set entrys = listbouton.entrySet() ;

        Iterator iter = entrys.iterator() ;

        while(iter.hasNext()) {
            Map.Entry me = (Map.Entry)iter.next();  //don't understand 
            this.add((Component) me.getValue()) ;   //don't understand
        }

        EcouteCalcul ecout = new EcouteCalcul(this) ;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白我们如何使用HashMap- 这是一个接口 - 没有重新定义JPanel的功能.

Pau*_*aul 103

Map.Entry是一个关键,它的价值合二为一.这允许您迭代Map.entrySet()而不必迭代Map.keySet(),然后获取每个键的值.写出你所拥有的更好的方法是:

for (Map.Entry<String, JButton> entry : listbouton.entrySet())
{
  String key = entry.getKey();
  JButton value = entry.getValue();

  this.add(value);
}
Run Code Online (Sandbox Code Playgroud)

如果不清楚,请告诉我,我会修改我的答案.

  • 如果方法返回实现`interface`的对象集合,则无需担心底层对象是什么.在这种特殊情况下,实现接口`Map.Entry`的对象是你正在使用的任何`Map`实现中的内部类(在这种情况下,它构建在`HashMap`中).您需要知道的是,对象符合接口指定的合同,因此您可以调用接口指定的方法. (4认同)
  • @LearNer,你是对的.每个条目都是对`listbouton`所持有的条目的引用,因此对条目的更改将反映在地图中.但是,不应在此循环中从地图中删除项目.迭代集合时从集合中删除对象的正确方法是使用`Iterator`并调用`remove`方法. (2认同)

jyt*_*tou 5

请注意,您还可以使用 Map.Entry 作为主要类型,使用其基本实现 AbstractMap.SimpleEntry 创建自己的结构。例如,如果你想要一个有序的条目列表,你可以写:

List<Map.Entry<String, Integer>> entries = new ArrayList<>();
entries.add(new AbstractMap.SimpleEntry<String, Integer>(myStringValue, myIntValue));
Run Code Online (Sandbox Code Playgroud)

等等。从那里,你有一个元组列表。当您想要有序元组并且基本 Map 是不可行的时非常有用。