360 votes

Comment obtenir le premier élément d'une liste ou d'un ensemble ?

J'aimerais savoir si je peux obtenir le premier élément d'une liste ou d'un ensemble. Quelle méthode utiliser ?

6 votes

L'ensemble n'a pas de premier élément. Pour List : list.get(0) ;

0 votes

Lequel avez-vous, une liste ou un ensemble ? Les ensembles ne sont pas nécessairement dans un ordre particulier...

2 votes

Certains ensembles sont ordonnés, comme TreeSet .

386voto

stacker Points 34209

Voir la javadoc

de Liste

list.get(0);

o Définir

set.iterator().next();

et vérifiez la taille avant d'utiliser les méthodes ci-dessus en invoquant isEmpty()

!list_or_set.isEmpty()

11 votes

Utilisez isEmpty() au lieu de size()>0 . Cela montre mieux votre intention et est peut-être plus efficace (par exemple, LinkList size() est O(n)).

11 votes

@SteveKuo LinkedList a une variable de taille donc size() est O(1). De plus, isEmpty() est implémenté comme size() == 0.

2 votes

Utilisez toujours List.iterator().next() o Set.iterator().next() pour éviter O(N) pour les structures de données liées, vous ne savez jamais quelle implémentation vous recevrez, et bien sûr vérifier en utilisant Set.isEmpty() o List.isEmpty() pour la même raison, dans les deux cas, sera toujours O(1) au lieu d'un potentiel O(N) si, à nouveau, une implémentation de la structure de données liée est transmise. LinkedList o LinkedHashSet

331voto

bdares Points 10615
Collection c;

Iterator iter = c.iterator();

Object first = iter.next();

(C'est ce qui se rapproche le plus d'un "premier" élément d'un fichier Set . Vous devez réaliser que cela n'a absolument aucune signification pour la plupart des implémentations de Set . Cela peut avoir une signification pour LinkedHashSet et TreeSet, mais pas pour HashSet).

5 votes

Utile si vous voulez juste obtenir quelque chose de l'ensemble, aussi vite que possible

18 votes

C'est suffisant si votre ensemble ne comporte qu'un seul élément.

0 votes

Collection c ; c.iterator().next() ;

160voto

Sonson123 Points 1464

En Java >=8, vous pouvez également utiliser l'API de streaming :

Optional<String> first = set.stream().findFirst();

(Utile si le Set/List peut être vide).

0 votes

C'est très bien, mais sans get(), je ne pourrais pas appeler les méthodes spécifiques aux éléments résultants. set.stream().findFirst().get() vous permettra d'appeler n'importe quelle méthode sur l'objet résultant. ex : set.stream().findFirst().get().getMessage()

3 votes

Fais attention cependant, parce que get() lèvera une exception si l'option est vide. Il y a beaucoup d'autres méthodes sur Optional qui pourrait être plus approprié.

1 votes

Si vous voulez qu'il retourne null, il suffit de faire String first = set.stream().findFirst().orElse(null);

56voto

Ch Vas Points 541

Supposons que vous ayez un List<String> strings dont vous voulez le premier élément.

Il existe plusieurs façons de le faire :

Java (pré-8) :

String firstElement = null;
if (!strings.isEmpty() && strings.size() > 0) {
    firstElement = strings.get(0);
}

Java 8 :

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

Goyave

String firstElement = Iterables.getFirst(strings, null);

Apache commons (4+)

String firstElement = (String) IteratorUtils.get(strings, 0);

Apache commons (avant 4)

String firstElement = (String) CollectionUtils.get(strings, 0);

Suivi par ou encapsulé dans les contrôles appropriés ou les blocs try-catch.

Kotlin :

Dans Kotlin, les deux Tableaux et la plupart des Collections (par exemple : Liste) ont un first de la méthode. Votre code ressemblerait donc à quelque chose comme ceci

pour une liste :

val stringsList: List<String?> = listOf("a", "b", null)
val first: String? = stringsList.first()

pour un tableau :

val stringArray: Array<String?> = arrayOf("a", "b", null)
val first: String? = stringArray.first()

Suivi par ou encapsulé dans les contrôles appropriés ou les blocs try-catch.

Kotlin comprend également des moyens plus sûrs de le faire pour kotlin.collections par exemple firstOrNull o getOrElse ou getOrDefault lors de l'utilisation de JRE8

23voto

Radek Postołowicz Points 2274

Je suis surpris que personne n'ait encore suggéré la solution de la goyave :

com.google.common.collect.Iterables.get(collection, 0)
// or
com.google.common.collect.Iterables.get(collection, 0, defaultValue)
// or
com.google.common.collect.Iterables.getFirst(collection, defaultValue)

ou si vous attendez un seul élément :

com.google.common.collect.Iterables.getOnlyElement(collection, defaultValue)
// or
com.google.common.collect.Iterables.getOnlyElement(collection)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X