Если результат для людей читается, а элементы массива имеют правильный toString()
определенный ...
outputString.write(Arrays.toString(array));
Map<String, String> map = ...
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "/" + entry.getValue());
}
Корректный способ сделать это должно использовать принятый ответ, поскольку это является самым эффективным. Я нахожу, что следующий код выглядит немного более чистым.
for (String key: map.keySet()) {
System.out.println(key + "/" + map.get(key));
}
Типичный код для итерации по карте:
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
, обновляется.
Да, порядок зависит от определенной Реализации 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();
// ...
}
В теории самый эффективный путь будет зависеть от который реализация Карты. Официальный способ сделать это должно звонить map.entrySet()
, который возвращает ряд Map.Entry
, каждый из которых содержит ключ и значение (entry.getKey()
и entry.getValue()
).
В особенной реализации, это могло бы иметь некоторое значение, используете ли Вы map.keySet()
, map.entrySet()
или что-то еще. Но я не могу думать о причине, почему любой записал бы его как этот. Скорее всего, это не имеет никакого значения к производительности, что Вы делаете.
И да, порядок будет зависеть от реализации - а также (возможно) порядок вставки и других трудных к управлению факторов.
[редактирование] я записал valueSet()
первоначально, но конечно entrySet()
на самом деле ответ.
Это - два вопроса о части:
то, Как выполнить итерации по записям Карты - @ScArcher2, имеет , ответил настолько отлично.
, Что является порядком повторения - если Вы просто используете Map
, тогда строго говоря, существует никакие гарантии упорядочивания . Таким образом, Вы не должны действительно полагаться на упорядочивание, данное никакой реализацией. Однако SortedMap
интерфейс расширяет Map
и обеспечивает точно, что Вы ищете - реализации будут aways давать последовательный порядок сортировки.
NavigableMap
другое полезное расширение - это SortedMap
с дополнительными методами для нахождения записей их заказанным положением в наборе ключей. Таким образом, потенциально это может устранить необходимость итерации во-первых - Вы могли бы быть в состоянии найти определенное entry
, Вы после используете higherEntry
, lowerEntry
, ceilingEntry
, или floorEntry
методы. descendingMap
метод даже дает Вам явный метод инвертирование пересекающегося порядка .
К вашему сведению можно также использовать map.keySet()
и map.values()
, если Вы только интересуетесь ключами/значениями карты а не другого.
Пример использования итератора и дженериков:
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();
// ...
}
Попробуйте это с помощью Java 1.4:
for( Iterator entries = myMap.entrySet().iterator(); entries.hasNext();){
Entry entry = (Entry) entries.next();
System.out.println(entry.getKey() + "/" + entry.getValue());
//...
}
Используя 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));
, Если у меня есть объект, реализовывая интерфейс Map в Java и я хочу выполнить итерации по каждой паре, содержавшей в нем, каков самый эффективный способ пройти карту?
, Если эффективность цикличного выполнения ключи является приоритетом для Вашего приложения, то выберите Map
реализация, которая поддерживает ключи в Вашем желаемом порядке.
упорядочивание элементов будет зависеть от определенной реализации Map, которую я имею для интерфейса?
Да, абсолютно.
Map
реализации обещают определенный итеративный порядок, другие не делают. Map
поддерживают другое упорядочивание пар "ключ-значение". Видят эту таблицу, я создал суммирование различного Map
реализации, связанные 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] будет последним.