Map.Entry:如何使用它?

时间:2011-12-31 18:07:56

标签: java collections map 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) ;
    }
}

我不明白如何在不重新定义Map.Entry函数的情况下使用Map.Entry - 这是一个接口。

8 个答案:

答案 0 :(得分:92)

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);
}

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

答案 1 :(得分:2)

此代码最好改写为:

for( Map.Entry me : entrys.entrySet() )
{
    this.add( (Component) me.getValue() );
}

它相当于:

for( Component comp : entrys.getValues() )
{
    this.add( comp );
}

当您枚举映射的条目时,迭代会生成一系列实现Map.Entry接口的对象。这些对象中的每一个都包含一个键和一个值。

枚举地图的条目比枚举其值更有效,但这个假设认为你的MapHashMap,并且还假定了内在的知识HashMap类的工作(实现细节)。可以说更确切的是,无论你的地图如何实现,(无论是HashMap还是别的,)如果你需要地图的关键和值,那么枚举条目将比枚举键更有效,然后再次为每个键调用映射以查找相应的值。

答案 2 :(得分:1)

Map是Key + Value对的集合,可视化如下:

{[fooKey=fooValue],barKey=barValue],[quxKey=quxValue]}

Map接口允许访问此集合的几个选项:Key set [fooKey, barKey,quxKey],Value set [fooValue, barValue, quxValue],最后输入Set [fooKey=fooValue],barKey=barValue],[quxKey=quxValue]

条目集只是方便迭代地图中的键值对,Map.Entry是每个键值对的表示。最后一个循环的等效方法是:

for (String buttonKey: listbouton.keySet()) {
    this.add(listbouton.get(buttonKey)) ;
}

for (JButton button: listbouton.values()) {
    this.add(button) ;
}

答案 3 :(得分:1)

地图由键/值对组成。例如,在您的代码中,一个键是“Add”,关联的值是JButton(“+”)。 Map.Entry是Map中包含的单个键/值对。它最常用的两种方法是getKey() and getValue()。您的代码将所有对完成为Set:

Set entrys = listbouton.entrySet() ;

并迭代它们。现在,它只使用me.getValue()查看部分并将它们添加到您的PanneauCalcul

this.add((Component) me.getValue()) ;   //don't understand

如果您需要查看两者键和值,这种类型的循环(通过Map.Entry)通常是有意义的。但是,在您的情况下,您没有使用密钥,因此更简单的版本是在地图中获取所有并添加它们。 e.g。

for (JButton jb:listbouton.values()) {
  this.add(jb);
}

最后一条评论。 HashMap中的迭代顺序非常随机。因此按钮将以半随机顺序添加到您的PanneauCalcul中。如果要保留按钮的顺序,则应使用LinkedHashMap。

答案 4 :(得分:1)

Hash-Map将(key,value)对存储为Map.Entry Type。如您所知,Hash-Map使用Linked Hash-Map(如果发生碰撞)。因此,Hash-Map Bucket中的每个Node都是Map.Entry类型。因此,每当您遍历Hash-Map时,您将获得类型为Map.Entry的节点。

现在在您的示例中,当您遍历Hash-Map时,您将获得Map.Entry类型(这是接口),要从此Map.Entry节点对象获取Key和Value,接口提供的方法如getValue( ),getKey()等。根据代码,在你的对象中你添加所有运算符JButtons viz(+, - ,/,*,=)。

答案 5 :(得分:0)

Map.Entry接口帮助我们迭代Map类

检查这个简单的例子:

public class MapDemo {
    public static void main(String[] args) {
     Map<Integer,String> map=new HashMap();
     map.put(1, "Kamran");
        map.put(2, "Ali");
        map.put(3, "From");
        map.put(4, "Dir");
        map.put(5, "Lower");
        for(Map.Entry m:map.entrySet()){
        System.out.println(m.getKey()+"  "+m.getValue());
        }
    }
}

答案 6 :(得分:0)

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

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

以此类推。从那里,您有一个元组列表。当您想要有序元组并且基本Map不再需要时非常有用。

答案 7 :(得分:0)

public HashMap<Integer,Obj> ListeObj= new HashMap<>();

public void addObj(String param1, String param2, String param3){
  Obj newObj = new Obj(param1, param2, param3);
  this.ListObj.put(newObj.getId(), newObj);
}

public ArrayList<Integer> searchdObj (int idObj){
  ArrayList<Integer> returnList = new ArrayList<>();
  for (java.util.Map.Entry<Integer, Obj> e : this.ListObj.entrySet()){
    if(e.getValue().getName().equals(idObj)) {
      returnList.add(e.getKey());
    }
  }
return returnList;
}