자바프로그래밍 컬렉션 (2) Set 종류

최주영·2023년 3월 28일
0

자바

목록 보기
20/30

Set

  • 저장 순서가 없고, 데이터를 중복 저장되지 않는 자료구조
  • 종류 (3가지)
    -> HashSet, LinkedHashSet, TreeSet

주로 고유한 항목의 집합이 필요할 때 사용 (회원 ID 집합)


✅ (1) HashSet

💡 List, Set, ,Map 처럼 Hash 자료구조를 사용하려면 정수로된 숫자 값인 해시코드가 필요
정수 타입이 아닌 다른 타입들을 어떻게 숫자 해시코드를 제공하는 걸까?
-> 자바는 모든 객체가 자신만의 해시코드를 표현할 수 있는 기능을 제공함
-> ObjecthashCode() 메서드

public class Object{ // 인스턴스가 다르면 해시코드가 다름
	public int hashCode(); // 객체의 참조값을 기반으로 해시코드 생성 (정수 값으로 생성)
}

기본적으로 ArrayList에서 나왔던 size, isEmpty, contains, remove, add 등 메소드는 동일

// 데이터 저장한 후 
// set에 저장된 데이터를 한개씩 출력하기
// 어떤 값에 대해서 지칭할 수 없기 때문에(순서가 x)

		HashSet set = new HashSet();
		// 데이터 저장하기
		set.add("유병승");
		set.add("최주영");
		set.add("최솔");
		set.add("이다영");
		
		Iterator it = set.iterator(); // Iterator 인터페이스를 이용해서 출력
		
		System.out.println("===Iterator로 출력하기===");
		while(it.hasNext()) { // 다음으로 갈수있는것이 있는지 물어봄
			// 기본적으로 set에서 add함수의 반환형은 object기 때문에 형변환 해줘야함
			String value = (String)it.next(); 
			System.out.println(value); 
		}

  • 다른 클랙스 객체를 대상으로 값 넣어보기
		HashSet students = new HashSet();
        // 객체를 값 으로 넣기
        students.add(new Student("유병승",1,3,'남'));
		students.add(new Student("최주영",3,2,'남'));
		students.add(new Student("김예린",2,1,'여'));
		students.add(new Student("윤나라",2,2,'여'));
        
        
        // 전체 출력
        students.forEach((s)->System.out.println(s));
        
        
        // 여자인 사람만 뽑기
		for(Object o : students) {
			Student s = (Student)o;
			if(s.getGender() == '여') {
				System.out.println(s.getName()+" "+s.getGender());
			}
		}
        
        
        // set과 list의 호환하기
        // ArrayList 인자값 안에 HashSet 값을 넣음
		ArrayList studentList = new ArrayList(students); // HashSet -> ArrayList
		// 리스트로 변환 후 출력
		System.out.println(studentList.get(0)); // 리스트로 변환했기 때문에 인덱스로 값 접근 가능
		System.out.println(studentList.get(1));
        
        
        // List.of 메소드 -> List 타입으로만 접근 가능 (ArrayList로 접근 x)
        List testData = List.of(1,2,3,4,5,5,6,6,7,7,8,8,10,10); // 중복값 포함해서 만듬
		HashSet hs = new HashSet(testData);  // 리스트 -> HashSet으로 바뀜
		ArrayList al = new ArrayList(hs);  // HashSet -> 리스트로 바뀜
		for(Object o : al) {
			System.out.println(o); // 1,2,3,4,5,6,7,8,10
		}
        
        // addAll 메소드 -> list1.addAll(list2); -> list2의 데이터를 list1 뒤에 붙인다.
        al.addAll(students);  
		System.out.println("students 데이터 추가 후 출력하기");
		al.forEach((e)->System.out.println(e));
 

✅ (2) LinkedHashSet

  • 저장 순서를 유지하는 set, 중복값은 HashSet 처럼 없음
  • 순서 : 데이터들이 입력된 순서로 출력
    ex) 3,2,1 순서대로 입력하면 3,2,1 순서대로 출력됨
		LinkedHashSet liset = new LinkedHashSet();
		liset.add(1);
		liset.add(3);
		liset.add(2);
		liset.add(2);
		liset.add(2);
		liset.add(8);
		liset.add(4);
		
		System.out.println("==linkedHashSet 출력==");
		for(Object i : liset) {
			System.out.println(i);   // 1 3 2 8 4 출력
		}

✅ (3) TreeSet

  • 데이터를 순회할 때 빠름
  • 순서 : 요소들은 정렬된 순서대로 저장되며 기준은 비교자(Comparator)로 변경 가능
  • 용도 : 데이터들을 정렬된 순서로 유지하면서 집합의 특성을 유지해야할 때 사용함
    (입력된 순서가 아닌, 데이터 값의 순서)
    ex) 3,2,1 순서대로 입력해도 1,2,3 순서대로 출력됨
		TreeSet studentTree = new TreeSet();
        // Student 클래스에 compareTo 재정의 되어있음
        // Student 클래스에서 Comparable 인터페이스를 구현하자!
		studentTree.add(new Student("최주영",1,1,'남')); 
		studentTree.add(new Student("최주영",2,1,'남')); 
		studentTree.add(new Student("김현영",2,2,'여'));
		studentTree.add(new Student("최하리",3,1,'여'));
		
		System.out.println("==studentTree 출력하기==");
		for(Object o : studentTree) {
			System.out.println(o);
		}
        
        
        // student 클래스
        public class Student implements Comparable{
        
        @Override 
		public int compareTo(Object o ) {  
			return this.name.compareTo(((Student)o).name);
		}	
	}
        
        
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글