2011-12-31 4 views
33

Я работаю над созданием калькулятора .. Я поместил свои кнопки в HashMap Collection, и когда я хочу добавить их в свой класс, который расширяет Jpanel, я не знаю, как я могу получить кнопки из своей коллекции. Итак, я нашел в сети 2 последних строки моего кода, но я не знаю их смысла.Map.Entry: Как его использовать?

Вот мой код:

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 «s функции.

+0

Что является 'добавить)' метод (? – fge

+1

http://stackoverflow.com/questions/1066589/java-iterate-through-hashmap –

ответ

69

Map.Entry - это ключ и его значение, объединенное в один класс. Это позволяет вам перебирать более Map.entrySet() вместо необходимости перебирать Map.keySet(), а затем получать значение для каждой клавиши. Лучший способ написать то, что у вас есть:

Если это неясно, сообщите мне, и я исправлю свой ответ.

+0

Спасибо :) Но я не понимаю, как мы можем иметь переменную, которая является ее типом интерфейса? Обычно мы реализуем интерфейс и переопределяем все его функции, и мы не можем создать объект с типом интерфейса. Правильно? – Copernic

+4

Если метод возвращает коллекцию объектов, реализующих «интерфейс», вам не нужно беспокоиться о том, что представляет собой основной объект. В этом конкретном случае объект, реализующий интерфейс «Map.Entry», является внутренним классом в любой реализации «Map», которую вы используете (в этом случае он встроен в «HashMap»). Все, что вам нужно знать, это то, что объект соответствует контракту, указанному интерфейсом, и поэтому вы можете вызвать методы, указанные интерфейсом. – Paul

+0

Что я хочу знать: как бы вы использовали Map.Entry здесь, не повторяя 'String, JButton' снова и снова? Оставляя параметры, генерируются безумные предупреждения от всех компиляторов, которые я пробовал, хотя они должны иметь возможность выводить возвращаемый тип 'entrySet()' из проверки типа 'listbouton'. –

3

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

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

и это эквивалентно:

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

Когда вы перечислить записи о карте, итерация дает ряд объектов, реализующих Map.Entry интерфейс. Каждый из этих объектов содержит ключ и значение.

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

2

карта представляет собой набор пар ключ + значение, которое визуализируется как это:

{[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) ; 
} 
+0

'listbouton' - это« Карта »- вы не можете напрямую перебирать ключи, вы должны перебирать« listbouton.keySet ». – Paul

2

Карта состоит из пар ключ/значение. Например, в вашем коде один ключ - «Добавить», а связанное значение - JButton («+»). Map.Entry - это одна пара ключей/значений, содержащаяся в Map. Это два наиболее используемых метода: 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

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

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

0

Map.Entry интерфейс помогает нам перебор карты классу

Проверьте этот простой пример:

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()); 
     } 
    } 
} 
Смежные вопросы