Mapa.Wpis: jak go używać?

Pracuję nad stworzeniem kalkulatora .. Umieszczam moje przyciski na kolekcji HashMap i kiedy chcę dodać je do mojej klasy, która rozszerza Jpanel, Nie wiem, jak Mogę uzyskać przyciski z mojej kolekcji. Znalazłem w sieci 2 ostatnie linijki mojego kodu, ale nie znam ich znaczenia.

Oto Mój kod:

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

Nie rozumiem jak możemy używać Map.Entry - który jest interfejsem-bez redefiniowania funkcji Map.Entry.

Author: Paul, 2011-12-31

7 answers

Map.Entry jest kluczem, a jego wartość połączona w jedną klasę. Pozwala to na iterację nad Map.entrySet() zamiast konieczności iteracji nad Map.keySet(), a następnie uzyskanie wartości dla każdego klucza. Lepszym sposobem na napisanie tego co masz jest:

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

  this.add(value);
}

Jeśli to nie było jasne daj mi znać, a poprawię swoją odpowiedź.

 83
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 18:06:33

Ten kod jest lepiej przepisany jako:

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

I jest równoważne:

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

Po wyliczeniu wpisów mapy, iteracja daje serię obiektów, które implementują interfejs Map.Entry. Każdy z tych obiektów zawiera klucz i wartość.

Powinno być nieco wydajniejsze wyliczanie wpisów mapy niż wyliczanie jej wartości, ale fakt ten zakłada, że twoje Map jest HashMap, a także zakłada znajomość wewnętrznego działania (szczegóły implementacji) klasy HashMap. Co można powiedzieć z nieco większą pewnością jest to, że bez względu na to, jak mapa jest zaimplementowana (czy jest to HashMap czy coś innego,), jeśli potrzebujesz zarówno klucza, jak i wartości mapy, wtedy wyliczanie wpisów będzie bardziej efektywne niż wyliczanie kluczy, a następnie dla każdego klucza ponowne wywołanie mapy w celu wyszukania odpowiedniej wartości.

 2
Author: Mike Nakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-27 22:02:12

Mapa składa się z par klucz / wartość. Na przykład w kodzie jednym z klawiszy jest "Add", a powiązaną wartością jest JButton ("+"). Mapa.Wpis jest pojedynczą parą klucz / wartość zawartą w mapie. Dwie najczęściej używane metody to getKey() and getValue(). Twój kod pobiera Wszystkie pary w zestaw:

Set entrys = listbouton.entrySet() ;

I iteruje nad nimi. Teraz patrzy tylko na wartość za pomocą me.getValue() i dodaje je do Twojego PanneauCalcul

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

Często tego typu pętla (na mapie.Wpis) ma sens, jeśli musisz spojrzeć na zarówno Klucz, jak i wartość. Jednak w Twoim przypadku nie używasz kluczy, więc o wiele prostszą wersją byłoby po prostu pobranie wszystkich wartości na mapie i dodanie ich. np.

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

Ostatni komentarz. Kolejność iteracji w Hashmapie jest dość przypadkowa. Tak więc przyciski zostaną dodane do PanneauCalcul w pół-losowej kolejności. Jeśli chcesz zachować kolejność przycisków, powinieneś użyć LinkedHashMap.

 1
Author: user949300,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-31 18:24:34

Mapa jest zbiorem par klucz + wartość, który jest wizualizowany w następujący sposób:

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

Interfejs Map pozwala na dostęp do tej kolekcji: Zestaw Kluczy [fooKey, barKey,quxKey], zestaw wartości [fooValue, barValue, quxValue] i wreszcie zestaw wpisów [fooKey=fooValue],barKey=barValue],[quxKey=quxValue].

Zestaw wpisów jest po prostu wygodny do iteracji nad kluczowymi parami wartości na mapie, mapie.Wpis jest reprezentacją każdej pary wartości klucza. Równoważnym sposobem wykonania ostatniej pętli jest:

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

Lub

for (JButton button: listbouton.values()) {
    this.add(button) ;
}
 1
Author: markdsievers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-31 23:41:36

Hash-Map przechowuje parę (klucz, wartość) jako mapę.Wpis Type.As wiesz, że Hash-Map używa Linked Hash-Map(w przypadku kolizji). Dlatego każdy węzeł w zasobniku Hash-Map jest typu Map.Wejście. Więc za każdym razem, gdy iterację przez Hash-Map otrzymasz węzły typu Mapa.Wejście.

Teraz w twoim przykładzie podczas iteracji przez Hash-Map, otrzymasz mapę.Typ wpisu (który jest interfejsem), aby uzyskać klucz i wartość z tej mapy.Obiekt węzła wejściowego, dostarczone przez interfejs metody takie jak getValue (), getKey () itp. Tak jak w kodzie, w obiekcie dodajesz wszystkie operatory JButtons viz (+,-,/,*,=).

 1
Author: bharatj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 16:58:32

Mapa.Interfejs wejściowy pomaga nam w iteracji klasy Map

Zobacz ten prosty przykład:

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
Author: Kamran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 06:55:11

Zauważ, że możesz również tworzyć własne struktury za pomocą mapy.Entry jako główny typ, używając jego podstawowej implementacji AbstractMap.Proste. Na przykład, jeśli chcesz mieć uporządkowaną listę wpisów, możesz napisać:

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

I tak dalej. Stamtąd masz listę krotek. Bardzo przydatne, gdy chcesz uporządkować krotki, a Podstawowa Mapa jest nie do przejścia.

 0
Author: jytou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-25 00:11:07