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
.
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ź.
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.
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.
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) ;
}
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 (+,-,/,*,=).
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());
}
}
}
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.
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