Извлечение итератора для HashMap вызывает исключение приведения - PullRequest
4 голосов
/ 21 февраля 2011

У меня есть некоторый относительно простой код, который я сделал: , предназначенный для извлечения итератора в HashMap и распечатки значений пары ключей .

Моя проблема в том, что когда я иду, чтобы получить итератор, я получаю это исключение.

Исключение в потоке "main" java.lang.ClassCastException: java.util.HashMap $ Запись не может быть приведена к java.lang.String
на Delete.main (Delete.java:25)

Вот мой код, и я указываю, где находится строка 25:

    Map <String, UpdatablePage> contentMap = new HashMap <String, UpdatablePage>();
    contentMap.put( "test", new UpdatablePage() );

    for ( Iterator it = (Iterator) contentMap.entrySet().iterator(); it.hasNext(); )
    {
        String key = (String) it.next();  // LINE 25
        UpdatablePage value = contentMap.get(key);
        System.out.print( "Key=" + key + ", Value=" + value.toString() );
    }

PS, я пытался перебрать карту, используя Map.Entry, но когда я собираюсь привести значение, возвращаемое итератором, к Map.Entry, я получаю еще одно исключение, почему?

// Error occurs when I do the following
Map.Entry pair = (Map.Entry) it.next();

Ответы [ 3 ]

4 голосов
/ 21 февраля 2011

В этой строке: for (Iterator it = (Iterator) contentMap.entrySet (). iterator (); it.hasNext ();)

entrySet () должен быть keySet () - ваш итератор возвращает каждую запись, но когда вы приводите их к String, я предполагаю, что это нужные вам ключи.

2 голосов
/ 21 февраля 2011

При итерации набора записей вы получаете Map.Entry объекты, для которых затем вы можете использовать getKey() и getValue() для извлечения ключа и значения.Не нужно перебирать ключи и отдельно извлекать значение (что гораздо менее эффективно).

Кстати, вы бы не приводили итератор к Map.Entry, но объект, которыйитератор возвращается на каждой итерации.

1 голос
/ 21 февраля 2011

Используйте keySet () и универсальный итератор для достижения наилучших результатов:

  Map<String, UpdatablePage> contentMap = new HashMap<String, UpdatablePage>();
  contentMap.put("test", new UpdatablePage());

  for (Iterator<String> it = contentMap.keySet().iterator(); it.hasNext();) {
     String key = it.next();
     UpdatablePage value = contentMap.get(key);
     System.out.print("Key=" + key + ", Value=" + value.toString());
  }

С помощью универсального итератора вообще нет необходимости в приведении типов, и вы получаете преимущество проверки типов во время компиляции, а не исключения времени выполнения, как вы видите.

...