¿Cómo puedo iterar sobre a Set
/ HashSet
sin lo siguiente?
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
¿Cómo puedo iterar sobre a Set
/ HashSet
sin lo siguiente?
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
Respuestas:
Puede usar un bucle for mejorado :
Set<String> set = new HashSet<String>();
//populate set
for (String s : set) {
System.out.println(s);
}
O con Java 8:
set.forEach(System.out::println);
Hay al menos seis formas adicionales de iterar sobre un conjunto. Los siguientes son conocidos por mí:
Método 1
// Obsolete Collection
Enumeration e = new Vector(movies).elements();
while (e.hasMoreElements()) {
System.out.println(e.nextElement());
}
Método 2
for (String movie : movies) {
System.out.println(movie);
}
Método 3
String[] movieArray = movies.toArray(new String[movies.size()]);
for (int i = 0; i < movieArray.length; i++) {
System.out.println(movieArray[i]);
}
Método 4
// Supported in Java 8 and above
movies.stream().forEach((movie) -> {
System.out.println(movie);
});
Método 5
// Supported in Java 8 and above
movies.stream().forEach(movie -> System.out.println(movie));
Método 6
// Supported in Java 8 and above
movies.stream().forEach(System.out::println);
Este es el HashSet
que usé para mis ejemplos:
Set<String> movies = new HashSet<>();
movies.add("Avatar");
movies.add("The Lord of the Rings");
movies.add("Titanic");
stream()
.
Para demostrarlo, considere el siguiente conjunto, que contiene diferentes objetos Persona:
Set<Person> people = new HashSet<Person>();
people.add(new Person("Tharindu", 10));
people.add(new Person("Martin", 20));
people.add(new Person("Fowler", 30));
Clase de modelo de persona
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
Puede usar la operación funcional para un código más ordenado
Set<String> set = new HashSet<String>();
set.forEach((s) -> {
System.out.println(s);
});
Aquí hay algunos consejos sobre cómo iterar un set junto con sus actuaciones:
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);
}
}
El código se explica por sí mismo.
El resultado de las duraciones son:
Iterator Duration: 495287
Lambda Duration: 50207470
Stream Api: 2427392
Split Iterator: 567294
Podemos ver las Lambda
tomas más largas mientras Iterator
que las más rápidas.
Enumeración(?):
Enumeration e = new Vector(set).elements();
while (e.hasMoreElements())
{
System.out.println(e.nextElement());
}
Otra forma (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));
o
set.stream().forEach((elem) -> {
System.out.println(elem);
});
Sin embargo, hay muy buenas respuestas ya disponibles para esto. Aquí está mi respuesta:
1. set.stream().forEach(System.out::println); // It simply uses stream to display set values
2. set.forEach(System.out::println); // It uses Enhanced forEach to display set values
Además, si este conjunto es de tipo de clase personalizada, por ejemplo: Cliente.
Set<Customer> setCust = new HashSet<>();
Customer c1 = new Customer(1, "Hena", 20);
Customer c2 = new Customer(2, "Meena", 24);
Customer c3 = new Customer(3, "Rahul", 30);
setCust.add(c1);
setCust.add(c2);
setCust.add(c3);
setCust.forEach((k) -> System.out.println(k.getId()+" "+k.getName()+" "+k.getAge()));
// Clase de cliente:
class Customer{
private int id;
private String name;
private int age;
public Customer(int id,String name,int age){
this.id=id;
this.name=name;
this.age=age;
} // Getter, Setter methods are present.}