반복기 없이 Set/HashSet에서 반복하는 방법
어떻게 반복할 수 있을까요?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);
한 세트에 대해 반복하는 방법은 적어도 6가지가 있습니다.다음 사항을 알고 있습니다.
방법 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];
시연하려면 다른 사용자 개체를 포함하는 다음 세트를 고려하십시오.
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 문에는 Collections and Arrays를 반복하기 위한 형식이 있습니다.이 폼은 확장형 스테이트먼트라고도 불리며 루프를 보다 콤팩트하고 읽기 쉽게 하기 위해 사용할 수 있습니다.
for(Person p:people){ System.out.println(p.getName()); }
- Java 8 - java.lang.Itherable. 각 사용자용(컨슈머)
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
보다 깔끔한 코드를 위해 기능 연산을 사용할 수 있습니다.
Set<String> set = new HashSet<String>();
set.forEach((s) -> {
System.out.println(s);
});
다음은 세트의 성능과 함께 세트를 반복하는 방법에 대한 몇 가지 팁입니다.
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
Lambda Duration: 50207470
Stream Api: 2427392
Split Iterator: 567294
볼 수 있습니다.Lambda
가장 오랜 시간이 걸린다Iterator
가장 빠릅니다.
열거(?):
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);
});
그러나 이에 대한 매우 좋은 답변이 이미 있습니다.제 대답은 다음과 같습니다.
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
또한 이 세트가 사용자 정의 클래스 유형인 경우(예: Customer).
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()));
// 고객 클래스:
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.}
언급URL : https://stackoverflow.com/questions/12455737/how-to-iterate-over-a-set-hashset-without-an-iterator
'programing' 카테고리의 다른 글
Vue 3: 부모 컴포넌트에서 자녀 컴포넌트로 이벤트 전송 (0) | 2022.08.28 |
---|---|
Vue: 프로펠러 함수의 기본값 (0) | 2022.08.28 |
java.util에서 값을 가져오는 것이 안전한가?여러 스레드로부터의 해시 맵(수정 없음) (0) | 2022.08.27 |
Storybook의 Vuex 저장소가 정의되지 않았습니다. (0) | 2022.08.27 |
(Java) 패키지 구성에 대한 베스트 프랙티스가 있습니까? (0) | 2022.08.27 |