Как итерации через Set/HashSet без Итератора?

Как я могу выполнять итерацию по Set/HashSet без следующего?

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

Ответ 1

Вы можете использовать расширенный для цикла:

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

//populate set

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

Или с помощью Java 8:

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

Ответ 2

Существует не менее шести дополнительных способов перебора по набору. Мне известны:

Метод 1

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

Метод 2

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

Метод 3

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

Метод 4

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

Метод 5

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

Метод 6

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

Это HashSet, который я использовал для своих примеров:

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

Ответ 3

Преобразование вашего набора в массив также может помочь вам выполнить итерацию элементов:

Object[] array = set.toArray();

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

Ответ 4

Чтобы продемонстрировать, рассмотрим следующий набор, который содержит разные объекты Person:

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

Класс персональной модели

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

}
  • Оператор for имеет форму, предназначенную для итерации через коллекции и массивы. Эта форма иногда называется расширенной для оператора и может использоваться, чтобы сделать ваши петли более компактными и удобными для чтения.
for(Person p:people){
  System.out.println(p.getName());
}
  1. Java 8 - java.lang.Iterable.forEach(Потребитель)
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

Ответ 5

Перечисление (?):

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

Другой способ (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));

или

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

Ответ 6

Вот несколько советов о том, как итератировать набор вместе с их характеристиками:

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);
    }
}

Код сам по себе.

Результат длительности:

Iterator Duration:495287
Lamda Duration:50207470
Stream API:2427392
Split Iterator:567294

Мы можем видеть, что Lambda занимает наибольшее время, а Iterator является самым быстрым.

Ответ 7

Функцию можно использовать для более аккуратного кода

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

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