Если у меня есть коллекция, например Collection<String> strs
, как я могу получить первый элемент? Я мог просто позвонить Iterator
, взять его первый next()
, а затем выбросить Iterator
. Есть ли менее расточительный способ сделать это?Java: Получить первый элемент из коллекции
ответ
Iterables.get(yourC, indexYouWant)
Потому что на самом деле, если вы используете коллекции, вы должны использовать Коллекции Google ,
То же самое, он просто проверяет, является ли это первым, и получает по индексу, если он есть. У этого также есть некоторый код, чтобы попытаться сбой быстрее в фактической Коллекции (то есть, если индекс слишком велик, он пытается понять это без повторения всей вещи и выброса исключения в конце). – Yishai
Честно говоря, производительность может быть немного медленнее, чем c.iterator(). Next() - но код намного яснее и проще изменять. – Carl
Я, конечно, согласен, что он чище, но ОП был расточительным, но я думаю, что, поскольку ваш ответ был принят, это то, что было желательным. – Yishai
Нет такой вещи, как «первый» элемент в Collection
, потому что это ... ну просто коллекция.
С Collection.iterator() метода Java Дока:
Там нет никаких гарантий относительно порядка, в котором возвращаются элементы ...
Таким образом, вы не можете.
Если вы используете другой интерфейс, такой как List, вы можете сделать следующее:
String first = strs.get(0);
Но непосредственно из коллекции это не представляется возможным.
Я не думаю, что 'get (int n)' определен для 'Collection' –
Вы правы, я скучаю по этому пункту. Я обновил ответ. Вы не можете! (если коллекция не реализована некоторым классом подкласса, который позволяет обеспечить гарантию) – OscarRyz
get не находится в интерфейсе коллекции –
Вы можете сделать это:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
документация Javadoc для сбора дает следующее предостережение WRT упорядочение элементов массива:
Если эта коллекция делает никаких гарантий относительно того, что заказать его элементы возвращаются его итератором, этот метод должен возвращать элементы в том же порядке.
Это создает новый массив String, намного дороже, чем создание итератора. –
Да, я подумал об этом после того, как я разместил это. Независимо от используемого метода заказ зависит от базовой реализации коллекции. «Первый» затем становится относительным термином. Однако, итератор() делает это, вероятно, лучше в большинстве случаев. –
-1 потому что это * никогда * лучше, чем итератор(). Next(). –
Похоже, что это лучший способ сделать это:
String first = strs.iterator().next();
Большой вопрос ... Во-первых, похоже, недосмотру для интерфейса Collection
.
Обратите внимание: «first» не всегда возвращает первое, что вы положили в коллекцию, и может иметь смысл только для упорядоченных коллекций. Возможно, поэтому нет вызова get(item)
, так как заказ не обязательно сохраняется.
Хотя это может показаться немного расточительным, это может быть не так плохо, как вы думаете. Iterator
действительно содержит информацию индексирования в коллекции, а не обычно копию всей коллекции. Вызов этого метода делает экземпляр объекта Iterator
, но это действительно единственные накладные расходы (не как копирование всех элементов).
Например, если вы посмотрите на тип, возвращаемый методом ArrayList<String>.iterator()
, мы видим, что это ArrayList::Itr
. Это внутренний класс, который просто обращается к элементам списка напрямую, а не копирует их.
странно, что это не принятый ответ –
Важно отметить, что этот «трюк» работает только тогда, когда коллекция действительно имеет содержимое. Если он пуст, итератор может вернуть ошибку, в которой нужно предварительно проверить размер коллекции. – spaceemotion
Это должен быть правильный ответ. Я не понимаю, почему ответ всегда «использует другую библиотеку!» , – Kuzeko
Если вы знаете, что коллекция является очередью, вы можете бросить коллекцию в очередь и получить ее легко.
Существует несколько структур, которые вы можете использовать для получения заказа, но вам нужно будет наложить его.
Согласен, если вы не хотите итерации, не используйте коллекцию. Вместо этого используйте другой более конкретный интерфейс. –
Интересно, хотя ... скажем, фактические базовые данные - это SortedSet, поэтому порядок имеет смысл, но у вас есть только представление Collection (для не глупых причин, скажем); если вы делаете сборку в список, очередь и т. д. и пытаетесь получить/poll/etc, произойдет ли катастрофа? Аналогичным образом, если базовая структура представляет собой Список, и так далее, и так далее. – Carl
@Cal - я не пробовал, но если вы создадите коллекцию в совершенно другой тип, чем изначально, вы должны получить сообщение об ошибке, но я не пробовал, поэтому я мог ошибаться. –
Похоже, ваша коллекция хочет быть список, как, так что я хотел бы предложить:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
В Java 8:
Optional<String> firstElement = collection.stream().findFirst();
Для более старых версий Java, есть метод GetFirst в гуавы Iterables:
Iterables.getFirst(iterable, defaultValue)
Решение java 8 особенно полезно, поскольку оно обрабатывает случай, когда коллекция пуста изящно. – SpaceTrucker
Не хорошо. Вы добавляете накладные расходы на stream(), чтобы получить get (0) только потому, что вам ленится писать 4 строки кода. if (! CollectionUtils.isEmpty (productList)) { \t \t return Optional.of (productList.get (0)); } return Дополнительно.пустой(); –
Отличное и простое решение. Спасибо. –
Это полностью зависит от того, реализация которых вы использовали, будь то ArrayList LinkedList , или другие реализации множества.
Если это реализация списка, то это просто, указав номер индекса.
В Java 8 у вас есть какие-то много операторов, чтобы использовать, например предел
/**
* Operator that limit the total number of items emitted through the pipeline
* Shall print
* [1]
* @throws InterruptedException
*/
@Test
public void limitStream() throws InterruptedException {
List<Integer> list = Arrays.asList(1, 2, 3, 1, 4, 2, 3)
.stream()
.limit(1)
.collect(toList());
System.out.println(list);
}
@ Ответ Виталия Федоренко http://stackoverflow.com/a/18165855/1562662 лучше. –
Вы можете сделать отливку. Например, если существует один способ с этим определением, и вы знаете, что этот метод возвращает список:
Collection<String> getStrings();
и после вызова его, у Вас должен быть первый элемент, вы можете сделать это следующим образом:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
- 1. Попробуйте получить первый элемент из пустой коллекции
- 2. получить первый, второй, третий элемент коллекции
- 3. Java 8 поток API: получить первый элемент коллекции найден
- 4. Как получить первый элемент коллекции в DQL
- 5. Получить первый элемент в отсортированном коллекции
- 6. Как я могу получить первый элемент из коллекции?
- 7. Получить случайный элемент из коллекции
- 8. Как получить первый элемент CollectionViewSource?
- 9. Как получить первый элемент из вспомогательного массива
- 10. Удалить каждый первый элемент сгруппированной коллекции
- 11. пытается получить первый элемент в возврате коллекции NULL
- 12. HTML-шаблоны усов - как получить первый элемент коллекции
- 13. Получить первый элемент коллекции с помощью свойства свойства Struts
- 14. получить первый элемент массива
- 15. Как получить первый элемент из списка json в selenium java?
- 16. Могу ли я получить элемент, который удаляется из коллекции java?
- 17. MeteorJS: как найти первый элемент в коллекции
- 18. Laravel удалить первый элемент в коллекции
- 19. ItemsControl дисплей только первый элемент коллекции
- 20. Получить первый элемент связанногоhashmap
- 21. AngularJS - Получить первый элемент
- 22. DropDownListFor не выбирает значение, когда первый элемент из коллекции
- 23. Удалить первый элемент из коллекции JQuery (сдвиг() эквивалент)
- 24. Есть ли способ, чтобы выбрать первый элемент из коллекции типов
- 25. получить первый элемент из списка без исключения
- 26. Как получить первый элемент из XmlSchema.Elements
- 27. Получить первый и последний элемент из диапазона
- 28. Получить первый и последний элемент из HashMap
- 29. как получить первый элемент из списка Tupled
- 30. TWIG Как получить первый элемент из массива
Конечно, может быть лучший способ получить доступ к первому элементу, если вы знаете класс контейнера реализации ... – Rooke
Обобщение для любого индекса: http://stackoverflow.com/questions/1047957/best-way-to- get-value-from-collection-by-index –
Похоже, вам нужна Queue.peek() – Johannes