Làm thế nào tôi có thể lặp lại qua một Set
/ HashSet
không có sau đây?
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
Làm thế nào tôi có thể lặp lại qua một Set
/ HashSet
không có sau đây?
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
Câu trả lời:
Bạn có thể sử dụng vòng lặp nâng cao :
Set<String> set = new HashSet<String>();
//populate set
for (String s : set) {
System.out.println(s);
}
Hoặc với Java 8:
set.forEach(System.out::println);
Có ít nhất sáu cách bổ sung để lặp qua một bộ. Những điều sau đây được biết đến với tôi:
Phương pháp 1
// Obsolete Collection
Enumeration e = new Vector(movies).elements();
while (e.hasMoreElements()) {
System.out.println(e.nextElement());
}
Phương pháp 2
for (String movie : movies) {
System.out.println(movie);
}
Phương pháp 3
String[] movieArray = movies.toArray(new String[movies.size()]);
for (int i = 0; i < movieArray.length; i++) {
System.out.println(movieArray[i]);
}
Phương pháp 4
// Supported in Java 8 and above
movies.stream().forEach((movie) -> {
System.out.println(movie);
});
Phương pháp 5
// Supported in Java 8 and above
movies.stream().forEach(movie -> System.out.println(movie));
Phương pháp 6
// Supported in Java 8 and above
movies.stream().forEach(System.out::println);
Đây là cái HashSet
mà tôi đã sử dụng cho các ví dụ của mình:
Set<String> movies = new HashSet<>();
movies.add("Avatar");
movies.add("The Lord of the Rings");
movies.add("Titanic");
stream()
.
Để chứng minh, hãy xem xét tập hợp sau, chứa các đối tượng Person khác nhau:
Set<Person> people = new HashSet<Person>();
people.add(new Person("Tharindu", 10));
people.add(new Person("Martin", 20));
people.add(new Person("Fowler", 30));
Lớp người mẫu
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
Bạn có thể sử dụng hoạt động chức năng cho một mã gọn gàng hơn
Set<String> set = new HashSet<String>();
set.forEach((s) -> {
System.out.println(s);
});
Dưới đây là một số mẹo về cách lặp lại một Bộ cùng với màn trình diễn của họ:
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);
}
}
Các mã là tự giải thích.
Kết quả của thời lượng là:
Iterator Duration: 495287
Lambda Duration: 50207470
Stream Api: 2427392
Split Iterator: 567294
Chúng ta có thể thấy Lambda
mất nhiều thời gian nhất trong khi Iterator
là nhanh nhất.
Bảng liệt kê (?):
Enumeration e = new Vector(set).elements();
while (e.hasMoreElements())
{
System.out.println(e.nextElement());
}
Một cách khác (java.util.Collections.enumutions ()):
for (Enumeration e1 = Collections.enumeration(set); e1.hasMoreElements();)
{
System.out.println(e1.nextElement());
}
Java 8:
set.forEach(element -> System.out.println(element));
hoặc là
set.stream().forEach((elem) -> {
System.out.println(elem);
});
Tuy nhiên, có những câu trả lời rất tốt đã có sẵn cho việc này. Đây là câu trả lời của tôi:
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
Ngoài ra, nếu Bộ này thuộc loại lớp Tùy chỉnh, ví dụ: Khách hàng.
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()));
// Lớp khách hàng:
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.}