web-dev-qa-db-ja.com

Map.Entry:使用方法

電卓の作成に取り組んでいます。ボタンを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をどのように使用できるかわかりません。

47
user1079425

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

これが明確でない場合はお知らせください。回答を修正します。

97
Paul

このコードは次のように書き直す方が適切です。

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
Mike Nakis

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(+、-、/、*、=)を追加しています。

1
bharatj

マップはキーと値のペアのコレクションであり、次のように視覚化されます。

{[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
markdsievers

マップはキー/値のペアで構成されます。たとえば、コードでは、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を使用する必要があります。

1
user949300

Map.Entryをメインタイプとして使用し、その基本実装AbstractMap.SimpleEntryを使用して独自の構造を作成することもできます。たとえば、エントリの順序付きリストが必要な場合は、次のように記述できます。

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

等々。そこから、タプルのリストがあります。順序付けされたタプルが必要で、基本的なマップが不要な場合に非常に便利です。

1
jytou

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());
        }
    }
}
0
Kamran