Как получить массив ключей из хэш-карты, которые не являются типом Object? - PullRequest
2 голосов
/ 15 января 2010
Iterator it = myHashMap.keySet().iterator();
while (it.hasNext()) {
   int next = it.next();
}

Это не работает, потому что it.next () возвращает Object. Мой hashmap использует целочисленные значения для ключей. Все мои методы принимают целочисленные значения для доступа к хэш-карте. Как я могу получить значение int при циклическом переключении ключей, чтобы передать его другим методам?

Ответы [ 7 ]

3 голосов
/ 15 января 2010

Вы должны использовать дженерики.

 Map<Integer, Object> myHashMap;

Это дает вам ключи, которые являются целыми числами (не int, но с этим ничего не поделаешь). Целое число может быть автоматически распаковано:

for (int key : myHashMap.keySet()){

}

Если вы хотите, чтобы ваши ключи находились в порядке возрастания, рассмотрите возможность использования TreeMap вместо HashMap.

3 голосов
/ 15 января 2010

Прежде всего, попробуйте использовать Generics при определении вашего Map / HashMap. Тогда вам не нужно беспокоиться.

Во-вторых, HashMap не использует примитивный тип для ключей. Это означает, что вы ошибаетесь, и в качестве ключей используется фактический тип Integer, а не int.

Быстрое исправление может быть приведено к int, как показано ниже

int next = ((Integer) it.next()).intValue();

Подробный пример с новым синтаксисом цикла (представлен в Java 5).

Map<Integer, String> map = new HashMap<Integer, String>();
...
for(int n : map.keySet()) {
  ...
}
2 голосов
/ 15 января 2010

Вы должны использовать дженерики Java:

Map<Integer, Object> myHashMap = new HashMap<Integer, Object>();
// ...
for (int key : myHashMap.keySet()) {
    // ...
}
1 голос
/ 15 января 2010

Ваши int s автоматически упакованы в Integer s, когда вы используете их как ключи в Map s.

Как знает любой Java-программист, вы не можете поместить int (или другое примитивное значение) в коллекцию. Коллекции могут содержать только ссылки на объекты, поэтому вы должны поместить значения примитивов в соответствующий класс-оболочку (в случае int это Integer). Когда вы берете объект из коллекции, вы получаете целое число, которое вы вставили; если вам нужно int, вы должны распаковать Integer, используя метод intValue. Весь этот бокс и распаковка является болью и загромождает ваш код. Функция автобоксирования и распаковки автоматизирует процесс, устраняя боль и беспорядок.

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

HashMaps в Java могут использовать только объекты, а не примитивы.

Таким образом, более вероятно, что ваши ключи имеют тип Integer, и что когда вы добавляете что-то, они повышаются с int до Integer.

Все это, как говорится, на самом деле Java старой школы. Ваша коллекция должна определять ключ и целевой тип с использованием обобщений, а также в Java для каждого for (Целочисленный ключ: myHashMap.keySet ())

Кстати: имейте в виду, что нет никаких гарантий относительно порядка, в котором вы будете повторяться.

0 голосов
/ 13 января 2013

Ответ прост: используйте общий итератор, как показано ниже.

Итератор it = myHashMap.keySet (). Iterator (); в то время как (it.hasNext ()) {int next = it.next (); }

0 голосов
/ 15 января 2010

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

Map<Integer, Object> map = new HashMap<Integer, Object>();

for(Map.Entry<Integer, Object> entry : map.entrySet()) {
    System.out.println("Key: " + entry.getKey());
    System.out.println("Value: " + entry.getValue());
}
...