Map.Entry: как его использовать? - PullRequest
48 голосов
/ 31 декабря 2011

Я работаю над созданием калькулятора.Я помещаю свои кнопки в коллекцию 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.

Ответы [ 7 ]

96 голосов
/ 31 декабря 2011

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

Если это неясно, дайте мне знать, и я исправлю свой ответ.

2 голосов
/ 31 декабря 2011

Этот код лучше переписать в виде:

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 или что-то еще), если вам нужен и ключ, и значение карты, то перечисление записей будетбудет более эффективным, чем перечисление ключей, а затем для каждого ключа снова вызывать карту для поиска соответствующего значения.

1 голос
/ 25 сентября 2018

Обратите внимание, что вы также можете создавать свои собственные структуры, используя Map.Entry в качестве основного типа, используя его базовую реализацию AbstractMap.SimpleEntry. Например, если вы хотите иметь упорядоченный список записей, вы можете написать:

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

И так далее. Оттуда у вас есть список кортежей. Очень полезно, когда вам нужны упорядоченные кортежи, а базовая карта не нужна.

1 голос
/ 09 сентября 2015

Hash-Map хранит пару (ключ, значение) в качестве типа Map.Entry. Как вы знаете, Hash-Map использует Linked Hash-Map (в случае возникновения коллизии).Поэтому каждый узел в корзине хэш-карты имеет тип Map.Entry.Поэтому, когда вы будете перебирать Hash-Map, вы будете получать Nodes of Type Map.Entry.

Теперь в вашем примере, когда вы выполняете итерацию по Hash-Map, вы получите тип Map.Entry (который является интерфейсом), чтобы получить ключ и значение из этого объекта узла Map.Entry, предоставленные интерфейсом методыкак getValue (), getKey () и т. д. Так, как в коде, в свой объект вы добавляете все операторы JButtons viz (+, -, /, *, =).

1 голос
/ 31 декабря 2011

Карта состоит из пар ключ / значение. Например, в вашем коде один ключ - «Добавить», а соответствующее значение - JButton («+»). Map.Entry - это одна пара ключ / значение, содержащаяся в карте. Это два наиболее часто используемых метода: getKey() and getValue(). Ваш код всех пар попадает в набор:

Set entrys = listbouton.entrySet() ;

и перебирает их. Теперь он только смотрит на значение , используя me.getValue(), и добавляет их к вашему PanneauCalcul

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

Часто этот тип цикла (над Map.Entry) имеет смысл, если вам нужно посмотреть и ключ и значение. Однако в вашем случае вы не используете ключи, поэтому гораздо более простой версией было бы просто получить все значения на вашей карте и добавить их. например,

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

Один последний комментарий. Порядок итерации в HashMap довольно случайный. Таким образом, кнопки будут добавлены в ваш PanneauCalcul в полуслучайном порядке. Если вы хотите сохранить порядок кнопок, вы должны использовать LinkedHashMap.

1 голос
/ 31 декабря 2011

Карта - это набор пар ключ + значение, которые визуализируются следующим образом:

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

Интерфейс карты предоставляет несколько вариантов доступа к этой коллекции: набор ключей [fooKey, barKey,quxKey], значение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) ;
}
0 голосов
/ 20 мая 2017

Интерфейс 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());
        }
    }
}
...