我正在努力创建一个计算器.. 我将我的按钮放在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
- 这是一个接口。
答案 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
接口的对象。这些对象中的每一个都包含一个键和一个值。
枚举地图的条目比枚举其值更有效,但这个假设认为你的Map
是HashMap
,并且还假定了内在的知识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;
}