Java: получить первый элемент из коллекции


если у меня есть коллекция, например Collection<String> strs, Как я могу сделать первый пункт? Я мог бы просто позвонить Iterator, взять первый next(), затем бросить Iterator подальше. Есть менее расточительный способ сделать это?

10 214

10 ответов:

Iterables.get (yourC, indexYouWant)

потому что на самом деле, если вы используете коллекции, вы должны использовать коллекции Google.

похоже, что это лучший способ, чтобы сделать это:

String first = strs.iterator().next();

большой вопрос... Во-первых, это похоже на оплошность для Collection интерфейс.

обратите внимание, что "первый" не всегда будет возвращать первое, что вы положили в коллекцию, и может иметь смысл только для упорядоченных коллекций. Может быть, именно поэтому нет get(item) вызов, так как заказ не обязательно сохраняется.

хотя это может показаться немного расточительным, это может быть не так плохо, как вы думаете. Этот Iterator на самом деле просто содержит информацию индексирования в коллекцию, а не обычно копию всей коллекции. Вызов этого метода создает экземпляр Iterator объект, но это действительно только накладные расходы (не как копирование всех элементов).

например, глядя на тип возвращаемого ArrayList<String>.iterator() способ, мы видим, что это ArrayList::Itr. Это внутренний класс, который просто обращается к элементам списка напрямую, а не копирует их.

в java 8:

Optional<String> firstElement = collection.stream().findFirst();

для более старых версий java существует метод getFirst в Guava Iterables:

Iterables.getFirst(iterable, defaultValue)

нет такой вещи, как "первый" элемент Collection потому что это .. ну просто коллекция.

от Java doc коллекция.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 упорядочение элементов массива:

Если эта коллекция дает какие-либо гарантии относительно того, в каком порядке ее элементы возвращаются итератором, этот метод должен возвращать элементы в том же порядке.