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