Существует ли элегантный способ получения только одного Entry<K,V>
из HashMap, без итераций, если ключ не известен.
Так как порядок ввода записи не важен, можем ли мы сказать что-то вроде
hashMapObject.get(zeroth_index);
Хотя я знаю, что такого метода индекса не существует.
Если бы я попробовал подход, упомянутый ниже, он все равно должен был бы получить весь набор записей хэш-карты .
for(Map.Entry<String, String> entry : MapObj.entrySet()) {
return entry;
}
Предложения приветствуются.
РЕДАКТИРОВАТЬ: Пожалуйста, предложите любую другую структуру данных, чтобы удовлетворить требования.
java
collections
Nilesh
источник
источник
firstEntry()
метод не определен в интерфейсе,SortedMap
а только вTreeMap
andConcurrentSkipListMap
:(SortedMap
потому что у него былfirstKey()
метод.Карты не упорядочены, поэтому нет такой вещи, как «первая запись», и поэтому также нет метода get-by-index для
Map
(илиHashMap
).Вы могли бы сделать это:
(Примечание: проверка на пустую карту опущена).
Ваш код не получает все записи на карте, он сразу же возвращается (и выходит из цикла) с первой найденной записью.
Чтобы напечатать ключ и значение этого первого элемента:
Примечание. Вызов
iterator()
не означает, что вы выполняете итерацию по всей карте.источник
LinkedHashMap
держит ключи в том порядке, в котором они были вставлены.Map
реализации, такие какLinkedHashMap
иTreeMap
имеют определенный порядок. (HashMap
нет).Я думаю, что итератор может быть самым простым решением.
Другое решение (не симпатичное):
Или пока (не лучше)
источник
Получить значения, преобразовать его в массив, получить первый элемент массива:
W.
источник
Почему вы хотите избежать
entrySet()
его вызова, как правило, не создает совершенно новый объект со своим собственным контекстом, а просто предоставляет объект фасада. Проще говоряentrySet()
, это довольно дешевая операция.источник
Если вы используете Java 8, это так же просто, как findFirst () :
Быстрый пример:
источник
Если вы действительно хотите API, который вы предложили, вы можете создать подкласс HashMap и, например, отслеживать ключи в списке. Не вижу смысла в этом на самом деле, но это дает вам то, что вы хотите. Если вы объясните предполагаемый вариант использования, возможно, мы сможем найти лучшее решение.
РЕДАКТИРОВАТЬ: я сознательно не углубился в сторону дженериков этого ...
источник
Что вы имеете в виду с "без итерации"?
Вы можете использовать,
map.entrySet().iterator().next()
и вы не будете перебирать карту (в смысле «прикосновение к каждому объекту»). Вы не можете получитьEntry<K, V>
без использования итератора, хотя. Javadoc of Map.Entry говорит:Можете ли вы объяснить более подробно, что вы пытаетесь достичь? Если вы хотите сначала обработать объекты, которые соответствуют определенному критерию (например, «иметь определенный ключ») и в противном случае отступить к остальным объектам, тогда посмотрите на PriorityQueue . Он упорядочит ваши объекты в соответствии с естественным порядком или заданным
Comparator
вами пользователем.источник
Этот подход не работает, потому что вы использовали HashMap. Я предполагаю, что использование LinkedHashMap будет правильным решением в этом случае.
источник
Это получило бы единственную запись с карты, которая примерно настолько близка, насколько это возможно, учитывая, что «первое» на самом деле не применимо.
источник
Наткнулся здесь, ища то же самое ... Затем я вспомнил
Iterables
класс из библиотеки Гуавы .Для того, чтобы получить «первый» элемент:
Iterables.getFirst( someMap.values(), null );
.По сути, делает то же, что и
Map.values().iterator().next()
, но также позволяет вам указать значение по умолчанию (в данном случае ноль), если на карте ничего не будет.Iterables.getLast( someMap.values(), null );
возвращает последний элемент на карте.Iterables.get( someMap.values(), 7, null );
возвращает седьмой элемент на карте, если он существует, в противном случае - значение по умолчанию (в данном случае ноль).Помните, однако, что HashMaps не заказаны ... поэтому не ожидайте
Iterables.getFirst
возврата первого элемента, который вы там бросили ... аналогично сIterables.getLast
. Может быть полезно , чтобы получить более отображенное значение , хотя.Возможно, не стоит добавлять библиотеку Guava только для этого, но если вы используете некоторые другие классные утилиты в этой библиотеке ...
источник
После вашего редактирования, вот мое предложение:
Если у вас есть только одна запись, вы можете заменить карту на двойной объект. В зависимости от типов и ваших предпочтений:
источник
источник
Я получил ответ: (это просто)
Возьмите ArrayList, затем разыграйте его и найдите размер массива. Вот :
Это покажет размер. (Дайте предложение). Это работает.
источник