web-dev-qa-db-fra.com

Comment itérer sur un ensemble / HashSet sans un itérateur?

Comment puis-je itérer sur un Set/HashSet sans ce qui suit?

Iterator iter = set.iterator();
while (iter.hasNext()) {
    System.out.println(iter.next());
}
251
user1621988

Vous pouvez utiliser un amélioré pour la boucle :

Set<String> set = new HashSet<String>();

//populate set

for (String s : set) {
    System.out.println(s);
}

Ou avec Java 8:

set.forEach(System.out::println);
455
assylias

Il y a au moins six façons supplémentaires d'itérer sur un ensemble. Je connais les éléments suivants:

Méthode 1

// Obsolete Collection
Enumeration e = new Vector(movies).elements();
while (e.hasMoreElements()) {
  System.out.println(e.nextElement());
}

Méthode 2

for (String movie : movies) {
  System.out.println(movie);
}

Méthode

String[] movieArray = movies.toArray(new String[movies.size()]);
for (int i = 0; i < movieArray.length; i++) {
  System.out.println(movieArray[i]);
}

Méthode 4

// Supported in Java 8 and above
movies.stream().forEach((movie) -> {
  System.out.println(movie);
});

Méthode 5

// Supported in Java 8 and above
movies.stream().forEach(movie -> System.out.println(movie));

Méthode 6

// Supported in Java 8 and above
movies.stream().forEach(System.out::println);

Voici le HashSet que j'ai utilisé pour mes exemples:

Set<String> movies = new HashSet<>();
movies.add("Avatar");
movies.add("The Lord of the Rings");
movies.add("Titanic");
82
Benny Neugebauer

Convertir votre ensemble en tablea peut également vous aider à parcourir les éléments:

Object[] array = set.toArray();

for(int i=0; i<array.length; i++)
   Object o = array[i];
22
Juvanis

Vous pouvez utiliser l'opération fonctionnelle pour un code plus soigné

Set<String> set = new HashSet<String>();

set.forEach((s) -> {
     System.out.println(s);
});
11
Samuel Moshie

Pour démontrer, considérons l'ensemble suivant, qui contient différents objets Personne:

Set<Person> people = new HashSet<Person>();
people.add(new Person("Tharindu", 10));
people.add(new Person("Martin", 20));
people.add(new Person("Fowler", 30));

Classe de modèle de personne

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //TODO - getters,setters ,overridden toString & compareTo methods

}
  1. L'instruction for a un formulaire conçu pour une itération dans Collections et tableaux. Ce formulaire est parfois appelé l'instruction for améliorée et peut être utilisé pour rendre vos boucles plus compactes et plus faciles à lire.
for(Person p:people){
  System.out.println(p.getName());
}
  1. Java 8 - Java.lang.Iterable.forEach (Consommateur)
people.forEach(p -> System.out.println(p.getName()));
default void forEach(Consumer<? super T> action)

Performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception. Unless otherwise specified by the implementing class, actions are performed in the order of iteration (if an iteration order is specified). Exceptions thrown by the action are relayed to the caller. Implementation Requirements:

The default implementation behaves as if: 

for (T t : this)
     action.accept(t);

Parameters: action - The action to be performed for each element

Throws: NullPointerException - if the specified action is null

Since: 1.8
11
Tharindu Rajarathna

Voici quelques conseils sur la façon de parcourir un Set avec ses performances:

public class IterateSet {

    public static void main(String[] args) {

        //example Set
        Set<String> set = new HashSet<>();

        set.add("Jack");
        set.add("John");
        set.add("Joe");
        set.add("Josh");

        long startTime = System.nanoTime();
        long endTime = System.nanoTime();

        //using iterator
        System.out.println("Using Iterator");
        startTime = System.nanoTime();
        Iterator<String> setIterator = set.iterator();
        while(setIterator.hasNext()){
            System.out.println(setIterator.next());
        }
        endTime = System.nanoTime();
        long durationIterator = (endTime - startTime);


        //using lambda
        System.out.println("Using Lambda");
        startTime = System.nanoTime();
        set.forEach((s) -> System.out.println(s));
        endTime = System.nanoTime();
        long durationLambda = (endTime - startTime);


        //using Stream API
        System.out.println("Using Stream API");
        startTime = System.nanoTime();
        set.stream().forEach((s) -> System.out.println(s));
        endTime = System.nanoTime();
        long durationStreamAPI = (endTime - startTime);


        //using Split Iterator (not recommended)
        System.out.println("Using Split Iterator");
        startTime = System.nanoTime();
        Spliterator<String> splitIterator = set.spliterator();
        splitIterator.forEachRemaining((s) -> System.out.println(s));
        endTime = System.nanoTime();
        long durationSplitIterator = (endTime - startTime);


        //time calculations
        System.out.println("Iterator Duration:" + durationIterator);
        System.out.println("Lamda Duration:" + durationLambda);
        System.out.println("Stream API:" + durationStreamAPI);
        System.out.println("Split Iterator:"+ durationSplitIterator);
    }
}

Le code est explicite.

Le résultat des durées est:

Iterator Duration: 495287
Lambda Duration: 50207470
Stream Api:       2427392
Split Iterator:    567294

Nous pouvons voir que la Lambda prend le plus de temps tandis que Iterator est le plus rapide.

10
Pritam Banerjee

Énumération(?):

Enumeration e = new Vector(set).elements();
while (e.hasMoreElements())
    {
        System.out.println(e.nextElement());
    }

Une autre façon (Java.util.Collections.enumeration ()):

for (Enumeration e1 = Collections.enumeration(set); e1.hasMoreElements();)
    {
        System.out.println(e1.nextElement());
    }

Java 8:

set.forEach(element -> System.out.println(element));

ou

set.stream().forEach((elem) -> {
    System.out.println(elem);
});
2
CamelTM