Как создать итеративную оболочку для TreeMap и HashMap (Java)? - PullRequest
4 голосов
/ 12 января 2010

У меня есть класс MyMap, который оборачивает TreeMap. (Скажите, что это коллекция собак, а ключи - это строки).

public class MyMap {
   private TreeMap<String, Dog> map;
...
}

Я бы хотел сделать MyMap итерируемым с циклом for-each. Я знаю, как бы я это сделал, если бы моим классом была оболочка LinkedList:

public class MyList implements Iterable<Dog> {
   private LinkedList<Dog> list;
   ...
   public Iterator<Dog> iterator() {
      return list.iterator();
   }
}

Но такое решение не работает для TreeMap, потому что TreeMap не имеет итератора (). Так как же сделать MyMap повторяемым?

И тот же вопрос, кроме MyMap, оборачивает HashMap (вместо TreeMap).

Спасибо.

Ответы [ 4 ]

8 голосов
/ 12 января 2010
public Iterator<Dog> iterator() {
      return map.values().iterator();
}
6 голосов
/ 12 января 2010

Это потому, что вы можете перебирать только ключи или значения карты, но не саму карту

Обычно вы можете сделать это:

for( Object value : mymap.values()  ){
  System.out.println(value);
}

Итак, я предлагаю следующее: должна ли ваша Карта иметь итерацию? Нет, если вы просто хотите получить значения ... или сами ключи.

Также рассмотрите возможность использования коллекций пересылки Google, таких как ForwardingList

4 голосов
/ 12 января 2010
public class MyMap implements Iterable<Dog> {
   private TreeMap<String, Dog> map;
   ...
   @Override
   public Iterator<Dog> iterator() {
      return map.values().iterator();
   }
}

map.values ​​() представляет собой коллекцию собак, содержащихся на карте. Итератор коллекции возвращает значения в том порядке, в котором их соответствующие ключи появляются в дереве. Спасибо Джонатану Фейнбергу.

1 голос
/ 12 января 2010

Одной из возможностей может быть определение метода entrySet () , который возвращает Set, а затем выполняет итерацию по Set.

Для каждой итерации будет выглядеть примерно так:

for (Map.Entry<String,Integer> m: someMap.entrySet()){
   System.out.println("Key="+m.getKey()+" value="+m.getValue());
}
...