JAVA - HashSet과 interator (2022-07-25)

2022. 7. 25. 21:453층 1구역 - 개발의 장/JAVA

1. Interator??

 

미국∙영국[ˈɪtəreɪt]
동사
  • (계산·컴퓨터 처리 절차를) 반복하다
  • 출처 - 네이버 검색(https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=iterate)

반복문의 성향을 띈다.

어떤 인덱스가 있으면 그 인덱스의 값을 돌면서 출력할 개체가 있다면

그 값을 출력한다.

 

그런데 반복문이라면 for나 while등도 사용이 가능할텐데 왜

interator를 따로 사용하는 것일까?

 

인덱스(배열)이 정해진 곳은 처음과 끝이 정해져 있기 때문에

for문 같은 반복문을 써도 괜찮다.

 

단, HashSet 같은 경우 인덱스가 존재하기는 하나 그 경계가 모호하여

for문을 쓰는 것이 애매하는 경우가 있을 수 있다.

 

그때 Iterator를 쓰는 것이 아닐까....? 라고 생각한다.

둘의 성능은 얼마나 차이나는지는 모르겠으나 

 

stackoverflow.com/questions/22267919/iterator-vs-for

14년도에 쓰여진 이글을 훑어보면 다른 개발자분들도 이걸 알고 쓰시는 분은 적은 듯 하다.

그냥 코드의 유지보수성?, 성능이나 가독성 등을 고려하여 둘 중 하나를 선택하는 듯.(

의견을 적당적당 읽어서 사실 잘 모름..;;)

 

2.예제

 

package hashSets;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;

public class Ex05 {

	public static void main(String[] args) {
		HashSet<String> hs = new HashSet();
		hs.add("1.대부");
		hs.add("2.반지의 제왕");
		hs.add("3.겨울왕국");
		hs.add("4.다크 나이트");
		hs.add("5.해리포터");
		hs.add("6.공공의 적");

		for (String data : hs) {
			System.out.println(data); // 항상 for문 가능
		}

		System.out.println();
		Iterator<String> it = hs.iterator(); // iterator를 사용하여
		while (it.hasNext()) { // hasNext를 사용하여 출력가능
			String data2 = it.next();
			System.out.println(data2);
		}

		ArrayList<String> list = new ArrayList<>(hs);
		// list.sort(null); //순서가 있다면 list.sort를 써 오름차순을 이용하여 출력가능
		Collections.sort(list); // 오름차순
		Collections.reverse(list); // 내림차순

		System.out.println(list);

	}
}

 

결과

 

1.대부
5.해리포터
6.공공의 적
2.반지의 제왕
4.다크 나이트
3.겨울왕국 <<항상 for문을 이용하여 출력가능

1.대부
5.해리포터
6.공공의 적
2.반지의 제왕
4.다크 나이트
3.겨울왕국 << Iterator를 이용한 출력
[6.공공의 적, 5.해리포터, 4.다크 나이트, 3.겨울왕국, 2.반지의 제왕, 1.대부]

 

ArrayList를 사용하여 sort를 이용하면 HashSet을 오름차순으로 나열 가능함.

ArrayList를 사용하여 reverse를 이용하면 HashSet을 내림차순으로 나열 가능함

 

 

2-1. Iterator를 이용한 remove

package hashSets;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;

public class Ex06 {
	public static void main(String[] args) {
		HashSet<String> hs = new HashSet();
		hs.add("1.대부");
		hs.add("2.반지의 제왕");
		hs.add("3.겨울왕국");
		hs.add("4.다크 나이트");
		hs.add("5.해리포터");
		hs.add("6.공공의 적");
		System.out.println(hs);
		
		Scanner input = new Scanner(System.in);
		System.out.print("삭제 할 책 : ");
		String name = input.nextLine();
		//항상 for문보다 사용할 수 있는것이 많다.
		Iterator<String> it = hs.iterator(); //Iterator를 사용하여 remove도 가능하다.
		while(it.hasNext()) { //hasNext는 데이터를 가져올 값이 있으면 true를 반환.
			if(name.equals(it.next())) {//next는 매개변수 혹은 Iterator 되는 타입으로 변경
				//Iterator에 값이 String이니까 String으로 반환.
				System.out.println("삭제완료");
				it.remove();
			}
		}
		System.out.println(hs);
	}
}