Java: Get first item from a collection

Jeśli mam kolekcję, taką jak Collection<String> strs, Jak mogę uzyskać pierwszy przedmiot? Mogę po prostu zadzwonić do Iterator, wziąć pierwszy next(), a następnie wyrzucić Iterator. Czy jest na to mniej marnotrawny sposób?

Author: Nick Heiner, 2009-11-04

10 answers

Iterables.get (yourC, indexYouWant)

Ponieważ tak naprawdę, jeśli używasz kolekcji, powinieneś używać kolekcji Google.

 111
Author: Carl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-08 09:53:32

Wygląda na to, że to najlepszy sposób, aby to zrobić:

String first = strs.iterator().next();
Świetne pytanie... Na początku wygląda to na przeoczenie interfejsu Collection.

Zauważ, że "first" nie zawsze zwróci pierwszą rzecz, którą umieścisz w kolekcji i może mieć sens tylko dla uporządkowanych kolekcji. Może dlatego nie ma get(item) wywołania, ponieważ kolejność niekoniecznie jest wytrwała.

Choć może wydawać się trochę marnotrawne, może nie być tak źle, jak myślisz. Iterator naprawdę zawiera indeksowanie informacji do zbioru, a nie zazwyczaj Kopia całego zbioru. Wywołanie tej metody powoduje utworzenie obiektu Iterator, ale jest to w rzeczywistości jedyne narzuty (nie tak jak kopiowanie wszystkich elementów).

Na przykład, patrząc na typ zwracany przez metodę ArrayList<String>.iterator(), widzimy, że jest to ArrayList::Itr. Jest to klasa wewnętrzna, która po prostu uzyskuje bezpośredni dostęp do elementów listy, a nie kopiuje je.

 347
Author: jheddings,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-04 02:39:55

W Javie 8:

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

Dla starszych wersji Javy istnieje metoda getFirst w Guava Iterables:

Iterables.getFirst(iterable, defaultValue)
 62
Author: Vitalii Fedorenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-29 15:23:09

Nie ma czegoś takiego jak "pierwszy" element w Collection, ponieważ jest .. cóż, po prostu kolekcja.

Z kolekcji Java doc.metoda iterator () :

nie ma gwarancji co do kolejności zwrotu elementów...

Więc nie możesz.]}

Jeśli używasz innego interfejsu, takiego jak List, możesz wykonać następujące czynności:

String first = strs.get(0);

Ale bezpośrednio ze zbioru nie jest to możliwe.

 37
Author: OscarRyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-04 02:34:29

Wygląda na to, że Twoja kolekcja chce być listowa, więc proponuję:

List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
 4
Author: Jim Ferrans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-04 02:34:30

W Javie 8 można używać wielu operatorów, na przykład 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);
}
 2
Author: paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 08:18:47

Możesz zrobić casting. Na przykład, jeśli istnieje jedna metoda z tą definicją i wiesz, że ta metoda zwraca listę:

Collection<String> getStrings();

I po wywołaniu go potrzebujesz pierwszego elementu, możesz to zrobić tak:

List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
 1
Author: Nacho Soriano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-09 09:45:27

Jeśli wiesz, że kolekcja jest kolejką, możesz wrzucić ją do kolejki i łatwo ją uzyskać.

Istnieje kilka struktur, których możesz użyć, aby uzyskać zamówienie, ale musisz do niego rzucić.

 0
Author: James Black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-04 02:33:30

To całkowicie zależy od tego, jakiej implementacji użyłeś, czy ArrayList linkedlist, czy innych implementacji set.

Jeśli jest ustawione, to można bezpośrednio uzyskać pierwszy element, ich pętla może być tricka nad kolekcją, utworzyć zmienną o wartości 1 i uzyskać wartość, gdy wartość znacznika jest 1 po tym przerwaniu pętli.

Jeśli jest implementacją list, to jest to łatwe przez zdefiniowanie numeru indeksu.

 0
Author: Sindhoo Oad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-28 10:12:07

Możesz to zrobić:

String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];

Javadoc Dla Kolekcji daje następujące zastrzeżenie wrt uporządkowanie elementów tablicy:

Jeśli zbiór ten daje jakiekolwiek gwarancje, w jakiej kolejności jego elementy są zwracane przez iterator, metoda ta musi zwrócić elementy w tej samej kolejności.

 -2
Author: Andy Gherna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-04 02:32:07