Если у меня есть коллекция, например Collection<String> strs
, как я могу получить первый элемент? Я мог бы просто вызвать Iterator
, взять его первый next()
, а затем выбросить Iterator
. Есть ли менее расточительный способ сделать это?
Java: получить первый элемент из коллекции
Ответ 1
Iterables.get(yourC, indexYouWant)
Потому что, действительно, если вы используете Коллекции, вы должны использовать Коллекции Google.
Ответ 2
Похоже, это лучший способ сделать это:
String first = strs.iterator().next();
Большой вопрос... Сначала это выглядит как надзор для интерфейса Collection
.
Обратите внимание, что "first" не всегда возвращает первое, что вы помещаете в коллекцию, и может иметь смысл только для упорядоченных коллекций. Возможно, поэтому нет вызова get(item)
, так как порядок не обязательно сохраняется.
Хотя это может показаться немного расточительным, это может быть не так плохо, как вы думаете. Iterator
действительно содержит информацию индексирования в коллекции, а не обычно копию всей коллекции. Вызов этого метода создает экземпляр объекта Iterator
, но это действительно единственные накладные расходы (не как копирование всех элементов).
Например, глядя на тип, возвращаемый методом ArrayList<String>.iterator()
, мы видим, что это ArrayList::Itr
. Это внутренний класс, который просто обращается к элементам списка напрямую, а не копирует их.
Ответ 3
В java 8:
Optional<String> firstElement = collection.stream().findFirst();
Для более старых версий java существует метод getFirst в Guava Iterables:
Iterables.getFirst(iterable, defaultValue)
Ответ 4
В Collection
нет такой вещи, как "первый" элемент, потому что это... ну просто коллекция.
Из документа Java метода Collection.iterator():
Нет гарантий относительно порядка возврата элементов...
Итак, вы не можете.
Если вы используете другой интерфейс, например Список, вы можете сделать следующее:
String first = strs.get(0);
Но прямо из коллекции это невозможно.
Ответ 5
Похоже, ваша коллекция хочет быть похожей на List, поэтому я предлагаю:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
Ответ 6
В Java 8 у вас есть несколько операторов для использования, например limit
/**
* 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);
}
Ответ 7
Вы можете сделать кастинг. Например, если существует один метод с этим определением, и вы знаете, что этот метод возвращает список:
Collection<String> getStrings();
И после вызова, вам нужен первый элемент, вы можете сделать это следующим образом:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
Ответ 8
Если вы знаете, что коллекция является очередью, вы можете бросить коллекцию в очередь и получить ее легко.
Есть несколько структур, которые вы можете использовать для получения заказа, но вам нужно будет отбросить его.
Ответ 9
Это полностью зависит от того, какую реализацию вы использовали, будь то связанный с arraylist или другие реализации набора.
если он установлен, вы можете напрямую получить первый элемент, их может быть трюком по коллекции, создать переменную с номером 1 и получить значение, когда значение флага равно 1 после того, как этот цикл прерывается.
если это реализация списка, тогда легко определить номер индекса.
Ответ 10
Вы можете сделать это:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
javadoc for Collection предоставляет следующие предостережения для упорядочения элементов массива:
Если этот сборник дает какие-либо гарантии относительно того, в каком порядке его элементы возвращаются его итератором, этот метод должен возвращать элементы в том же порядке.