電卓の作成に取り組んでいます。ボタンをHashMap
コレクションに配置し、それらをJPanel
を拡張するクラスに追加するとき、コレクションからボタンを取得する方法がわかりません。そのため、インターネット上でコードの最後の2行を見つけましたが、その意味はわかりません。
ここに私のコードがあります:
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
をどのように使用できるかわかりません。
Map.Entry
はキーであり、その値は1つのクラスに結合されます。これにより、Map.entrySet()
を反復処理する代わりにMap.keySet()
を反復処理してから、各キーの値を取得できます。あなたが持っているものを書くためのより良い方法は次のとおりです。
for (Map.Entry<String, JButton> entry : listbouton.entrySet())
{
String key = entry.getKey();
JButton value = entry.getValue();
this.add(value);
}
これが明確でない場合はお知らせください。回答を修正します。
このコードは次のように書き直す方が適切です。
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
か他の何かであるかに関係なく)、マップのキーと値の両方が必要な場合は、エントリは、キーを列挙してから対応する値を検索するためにマップを再度呼び出すキーごとに列挙するよりも効率的です。
Hash-Mapは(キー、値)のペアをMap.Entry Typeとして保存します。ご存知のように、Hash-MapはLinked Hash-Mapを使用します(衝突が発生した場合)。したがって、Hash-Mapのバケット内の各Nodeは、Map.Entryタイプです。そのため、Hash-Mapを反復処理するたびに、タイプMap.Entryのノードが取得されます。
Hash-Mapを反復処理するときの例では、Map.Entry Type(Which is Interface)を取得します。このMap.Entry Node Objectからキーと値を取得するには、インターフェイスがメソッドを提供しますgetValue()、getKey()など。コードに従って、オブジェクトにすべての演算子JButton viz(+、-、/、*、=)を追加しています。
マップはキーと値のペアのコレクションであり、次のように視覚化されます。
{[fooKey=fooValue],barKey=barValue],[quxKey=quxValue]}
Mapインターフェイスでは、このコレクションにアクセスするためのいくつかのオプションを使用できます。キーセット[fooKey, barKey,quxKey]
、値セット[fooValue, barValue, quxValue]
、最後にエントリセット[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) ;
}
マップはキー/値のペアで構成されます。たとえば、コードでは、1つのキーは「追加」であり、関連付けられた値はJButton( "+")です。 Map.Entryは、Mapに含まれる単一のキー/値ペアです。最もよく使用される2つのメソッドはgetKey() and getValue()
です。コードはallのペアをセットに取得します:
Set entrys = listbouton.entrySet() ;
そしてそれらを繰り返します。これで、me.getValue()
を使用してvalue部分のみを参照し、PanneauCalculに追加します
this.add((Component) me.getValue()) ; //don't understand
多くの場合、このタイプのループ(Map.Entry上)は、キーと値をbothで見る必要がある場合に意味があります。ただし、あなたの場合、キーを使用していないので、はるかに簡単なバージョンは、マップ内のすべてのvaluesを取得して追加することです。例えば.
for (JButton jb:listbouton.values()) {
this.add(jb);
}
最後のコメント。 HashMapでの反復の順序はかなりランダムです。そのため、ボタンは半ランダムな順序でPanneauCalculに追加されます。ボタンの順序を保持する場合は、LinkedHashMapを使用する必要があります。
Map.Entryをメインタイプとして使用し、その基本実装AbstractMap.SimpleEntryを使用して独自の構造を作成することもできます。たとえば、エントリの順序付きリストが必要な場合は、次のように記述できます。
List<Map.Entry<String, Integer>> entries = new ArrayList<>();
entries.add(new AbstractMap.SimpleEntry<String, Integer>(myStringValue, myIntValue));
等々。そこから、タプルのリストがあります。順序付けされたタプルが必要で、基本的なマップが不要な場合に非常に便利です。
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());
}
}
}