Как я могу выполнять итерацию по Set
/HashSet
без следующего?
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
Как я могу выполнять итерацию по Set
/HashSet
без следующего?
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
Вы можете использовать расширенный для цикла:
Set<String> set = new HashSet<String>();
//populate set
for (String s : set) {
System.out.println(s);
}
Или с помощью Java 8:
set.forEach(System.out::println);
Существует не менее шести дополнительных способов перебора по набору. Мне известны:
Метод 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");
Преобразование вашего набора в массив также может помочь вам выполнить итерацию элементов:
Object[] array = set.toArray();
for(int i=0; i<array.length; i++)
Object o = array[i];
Чтобы продемонстрировать, рассмотрим следующий набор, который содержит разные объекты 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(Person p:people){ System.out.println(p.getName()); }
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
Перечисление (?):
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);
});
Вот несколько советов о том, как итератировать набор вместе с их характеристиками:
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
является самым быстрым.
Функцию можно использовать для более аккуратного кода
Set<String> set = new HashSet<String>();
set.forEach((s) -> {
System.out.println(s);
});