Как эффективно перебрать каждую запись на карте Java?

Если результат для людей читается, а элементы массива имеют правильный toString() определенный ...

outputString.write(Arrays.toString(array));
3022
задан Peter Mortensen 6 January 2019 в 00:46
поделиться

11 ответов

Map<String, String> map = ...
for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + "/" + entry.getValue());
}
4719
ответ дан Jared Burrows 6 January 2019 в 00:46
поделиться

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

for (String key: map.keySet()) {
   System.out.println(key + "/" + map.get(key));
}
52
ответ дан Chris Dail 6 January 2019 в 00:46
поделиться
  • 1
    Я думаю, что необходимо установить высоту Контейнерного Представления вместо ScrollView' s высота содержания. То, что я хотел бы знать, - то, как установить Контейнерную высоту Представлений на высоту встроенного представления с помощью ограничений макета. У Вас есть какие-либо мысли об этом? – Jeroen Fiege 28 April 2013 в 14:30

Типичный код для итерации по карте:

Map<String,Thing> map = ...;
for (Map.Entry<String,Thing> entry : map.entrySet()) {
    String key = entry.getKey();
    Thing thing = entry.getValue();
    ...
}

HashMap каноническая реализация Map и не делает гарантии (или хотя она не должна заявка на изменение, если никакая операция видоизменения не выполняется на ней). SortedMap возвратит записи на основе естественного упорядочивания ключей, или Comparator, если обеспечено. LinkedHashMap или возвратит записи в порядке вставки или порядке доступа в зависимости от того, как это было создано. EnumMap записи возвратов в естественном порядке ключей.

(Обновление: Я думаю, что это больше не верно. ) Примечание, IdentityHashMap entrySet итератор в настоящее время имеет специфическую реализацию, которая возвращает тот же Map.Entry экземпляр для каждого объекта в entrySet! Однако каждый раз новое итератор совершенствуется эти Map.Entry, обновляется.

122
ответ дан Tom Hawtin - tackline 6 January 2019 в 00:46
поделиться

Да, порядок зависит от определенной Реализации Map.

@ScArcher2 имеет более изящный синтаксис Java 1.5 . В 1,4, я сделал бы что-то вроде этого:

Iterator entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
  Entry thisEntry = (Entry) entries.next();
  Object key = thisEntry.getKey();
  Object value = thisEntry.getValue();
  // ...
}
224
ответ дан Peter Mortensen 6 January 2019 в 00:46
поделиться

В теории самый эффективный путь будет зависеть от который реализация Карты. Официальный способ сделать это должно звонить map.entrySet(), который возвращает ряд Map.Entry, каждый из которых содержит ключ и значение (entry.getKey() и entry.getValue()).

В особенной реализации, это могло бы иметь некоторое значение, используете ли Вы map.keySet(), map.entrySet() или что-то еще. Но я не могу думать о причине, почему любой записал бы его как этот. Скорее всего, это не имеет никакого значения к производительности, что Вы делаете.

И да, порядок будет зависеть от реализации - а также (возможно) порядок вставки и других трудных к управлению факторов.

[редактирование] я записал valueSet() первоначально, но конечно entrySet() на самом деле ответ.

29
ответ дан Pritam Banerjee 6 January 2019 в 00:46
поделиться

Это - два вопроса о части:

то, Как выполнить итерации по записям Карты - @ScArcher2, имеет , ответил настолько отлично.

, Что является порядком повторения - если Вы просто используете Map, тогда строго говоря, существует никакие гарантии упорядочивания . Таким образом, Вы не должны действительно полагаться на упорядочивание, данное никакой реализацией. Однако SortedMap интерфейс расширяет Map и обеспечивает точно, что Вы ищете - реализации будут aways давать последовательный порядок сортировки.

NavigableMap другое полезное расширение - это SortedMap с дополнительными методами для нахождения записей их заказанным положением в наборе ключей. Таким образом, потенциально это может устранить необходимость итерации во-первых - Вы могли бы быть в состоянии найти определенное entry, Вы после используете higherEntry, lowerEntry, ceilingEntry, или floorEntry методы. descendingMap метод даже дает Вам явный метод инвертирование пересекающегося порядка .

91
ответ дан Community 6 January 2019 в 00:46
поделиться

К вашему сведению можно также использовать map.keySet() и map.values(), если Вы только интересуетесь ключами/значениями карты а не другого.

51
ответ дан ckpwong 6 January 2019 в 00:46
поделиться
  • 1
    @Konstantin Burov: +1 и спасибо, Ваш ответ помог мне... – Pattabi Raman 25 July 2012 в 05:20

Пример использования итератора и дженериков:

Iterator<Map.Entry<String, String>> entries = myMap.entrySet().iterator();
while (entries.hasNext()) {
  Map.Entry<String, String> entry = entries.next();
  String key = entry.getKey();
  String value = entry.getValue();
  // ...
}
109
ответ дан 22 November 2019 в 19:47
поделиться

Попробуйте это с помощью Java 1.4:

for( Iterator entries = myMap.entrySet().iterator(); entries.hasNext();){

  Entry entry = (Entry) entries.next();

  System.out.println(entry.getKey() + "/" + entry.getValue());

  //...
}
27
ответ дан 22 November 2019 в 19:47
поделиться

Используя Java 7

Map<String,String> sampleMap = new HashMap<>();
for (sampleMap.Entry<String,String> entry : sampleMap.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();

    /* your Code as per the Business Justification  */

}

Используя Java 8

Map<String,String> sampleMap = new HashMap<>();

sampleMap.forEach((k, v) -> System.out.println("Key is :  " + k + " Value is :  " + v));
1
ответ дан 22 November 2019 в 19:47
поделиться

, Если у меня есть объект, реализовывая интерфейс Map в Java и я хочу выполнить итерации по каждой паре, содержавшей в нем, каков самый эффективный способ пройти карту?

, Если эффективность цикличного выполнения ключи является приоритетом для Вашего приложения, то выберите Map реализация, которая поддерживает ключи в Вашем желаемом порядке.

упорядочивание элементов будет зависеть от определенной реализации Map, которую я имею для интерфейса?

Да, абсолютно.

  • приблизительно Map реализации обещают определенный итеративный порядок, другие не делают.
  • Различные реализации Map поддерживают другое упорядочивание пар "ключ-значение".

Видят эту таблицу, я создал суммирование различного Map реализации, связанные Java 11. А именно, заметьте итеративный столбец порядка . Нажмите/коснитесь для изменения масштаба.

A table describing aspects of the various <code>Map</code> implementations bundled with Java 11.

Вы видите, что существует четыре, которые поддерживают порядок взаимодействия. Два из тех реализуют NavigableMap интерфейс.

более старое SortedMap интерфейс эффективно вытесняется более новым NavigableMap интерфейс. Но можно найти сторонние реализации, реализовав более старый интерфейс только.

Естественный порядок

, Если Вы хотите Map , который сохраняет его пар расположенными “natural order” ключа, используйте TreeMap или ConcurrentSkipListMap . Термин “natural order” означает класс реализаций ключей Comparable . Значение, возвращенное compareTo метод, используется для сравнения в сортировке.

Пользовательский порядок

, Если Вы хотите указать пользовательскую программу сортировки для своих ключей, которые будут использоваться в поддержании отсортированного порядка, передает Comparator реализация, соответствующая классу Ваших ключей. Используйте или TreeMap или ConcurrentSkipListMap , передавая Ваш Comparator.

Исходный порядок

вставки, Если Вы хотите, чтобы пары Вашей карты были сохранены в их первоначальном заказе, в который Вы вставили их в карту, используйте LinkedHashMap .

порядок

Перечислимого определения, Если Вы используете перечисление такой в качестве [1 136] DayOfWeek или Month как Ваши ключи, использует EnumMap класс. Не только этот класс высоко оптимизированный, чтобы использовать очень мало памяти и работать очень быстро, это поддерживает Ваших пар в порядке, определенном перечислением. Для [1 120], например, будет сначала найден ключ [1 121] при итерации, и ключ [1 122] будет последним.

1
ответ дан 22 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: