CF_09_HashSet 클래스

charl hi·2021년 9월 20일
0

JAVA_CF

목록 보기
9/12

HashSet

  • 순서X, 중복X : 순서 없고, 중복을 허용하지 않는다.
  • Set인터페이스를 구현한 대표적인 컬렉션 클래스
  • 순서를 유지하려면 ? -> LinkedHashSet

TreeSet

  • 순서X, 중복X : 순서 없고, 중복을 허용하지 않는다.
  • 범위 검색정렬에 유리
  • HashSet보다 데이터 추가, 삭제에 시간이 더 걸린다.


생성자

  1. HashSet()

  2. HashSet(Collectoin c)

  • 컬렉션 c에 있는 객체들 저장
  1. HashSet(int initialCapacity)
  • initialCapacity : 초기용량

  • 보통은 2배로

  1. HashSet(int initialCapacity, float loadFactor)
  • loadFactor : 언제 용량을 2배로 늘릴 건지에 대한 기준
    :
    • 예) loadFactor = 0.8 : 80% 찼을 때 용량 2배로 늘린다.

메소드

CF_02

추가

  1. boolean add(Object o)
  • 컬렉션에 객체 o 추가, 변화가 있으면 true
  1. boolean addAll(Collection c)
  • 컬렉션에, 컬렉션 c에 포함된 객체들을 추가, 변화가 있으면 true
  • 💖합집합


삭제

  1. boolean remove(Object o)
  • 컬렉션에서 저장한 객체 o를 삭제, 변화가 있으면 true
  1. boolean removeAll(Collection c)
  • 컬렉션에서,컬렉션 c에 포함된 모든 객체와 동일한 것들을 삭제
  • 변화가 있으면 true
  • 💖차집합
  1. boolean retainAll(Collection c)
  • 컬렉션에서, 컬렉션 c에 포함된 객체들을 제외한 나머지 객체들을 삭제
  • 변화가 있으면 true
  • 💖교집합?
  1. void clear()
  • 모두 삭제


검색

  1. boolean contains(Object o)
  • 컬렉션이 객체 o를 포함하는지 묻기. 참이면 true, 아니면 false
  1. boolean containsAll(Collection c)
  • 컬렉션이 컬렉션 c가 포함한 객체 전체를 포함하는지 묻기. 참이면 true, 아니면 false


기타

  1. Object[] toArray()
  • 저장된 객체들을 객체배열의 형태로 반환
  1. Object[] toArray(Object[] a)
  • 저장된 객체들을 주어진 객체배열a 에 저장
  1. boolean isEmpty()
  • 비어있는지 확인. 비어있으면 true, 차있으면 false
  1. int size()
  • 저장된 객체의 개수 반환


ex11_09

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Ex11_09 {

	public static void main(String[] args) {
		Object[] objArr = {"1", new Integer(1), "4", "2", "3", "3", "2", "4", "4"};
		//중복허용하지 않기 때문에 각자 하나씩만! "1"과 1은 다르니 중복아님
		
		Set set = new HashSet();
		
		//HashSet에 objArr의 요소들을 저장
		for(int i=0; i<objArr.length; i++) {
			set.add(objArr[i]);
		}
		
		//HashSet에 저장된 객체들 출력
		System.out.println(set);	//이게 set.toString()과 같은건가??
		
		//Iterator 이용한 출력
		Iterator it = set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}

	}

}

[1, 1, 2, 3, 4]
1
1
2
3
4
  • 주의! 순서가 저런 오름차순이 안될 수도 있다! Set은 순서 상관없으니까


Set을 정렬하는 방법(순서O)

  • 📢📢Set은 순서X -> sort() 없음 -> 정렬X

  • ✨✨✨ list에 담으면 된다!!!!!

Set set = new HashSet();
...
List list = new LinkedList(set);
List list = new ArrayList(set);
//이런 식으로! 그후 정렬
Collections.sort(list);

ex11_10

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class Ex11_10 {

	public static void main(String[] args) {
		Set set = new HashSet();
		
		//**set의 크기가 6보다 작은 동안
		for(int i=0; set.size() < 6; i++) {
			int num = (int)(Math.random()*45) + 1;
			//1<= x < 46
//			set.add(num);	오토박싱!
			set.add(new Integer(num));
		}
		System.out.println(set);	//***정렬X

		//***정렬을 하기 위해선 1. set의 모든 요소를 list에 저장해야 한다.
		List list = new LinkedList(set);	//LinkedList(Collection c)
		//2. 그 후 list 정렬!
		Collections.sort(list);		//Collections.sort(List list)
		//***Arrays.sort(배열) --- Collections.sort(list)
		//3. list 출력 
		System.out.println(list);


	}

}

[38, 40, 27, 28, 13, 31]
[13, 27, 28, 31, 38, 40]


Arrays.sort() vs. Collections.sort()

Arrays.sort()

  • 배열 정렬할 때
  • Dual-Pivoit Quicksort 사용
  • Quicksort은 배열에서 좋은 성능을 보이지만 stable하지 않다.

Collections.sort()

  • List 정렬할 때
  • merge sort와 insert sort를 합친 timsort 사용
  • stable이 필요한 Object에 쓰인다.


HashSet 중복검사(중복X)

  • HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인한다.

  • 같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.

  • ✨✨add()저장하기 전equals()hashCode()를 호출하여 중복검사를 한다!!!

  • equals() & hashCode()는 Object클래스의 메소드이므로, 이걸 상속받아 ✨✨오버라이딩하여 사용한다.

  • 💖💖우리가 만든 클래스를 HashSet에 저장하려면 반드시 equals(), hashCode()가 오버라이딩 되어 있어야 한다!!

ex11_11

import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;

public class Ex11_11 {

	public static void main(String[] args) {
		HashSet set = new HashSet();
		
		set.add("abc");
		set.add("abc");
		//중복처리(equals(), hashcode())로 저장안됨
		set.add(new Person("David", 10));
		set.add(new Person("David", 10));
		//***내가 만든 클래스가 equals(), hashcode()오버라이딩 안돼있으면 중복처리 안됨
		
		System.out.println(set);//오버라이딩한 toString

	}

}

class Person{
	String name;
	int age;
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	@Override
	public int hashCode() {
		//int hash(Object... value); 가변인자로 0~n개 가능!!
		return Objects.hash(name, age);
	}

	@Override
	public boolean equals(Object obj) {
		if(!(obj instanceof Person)) return false;
		//obj가 Person의 자손이냐
		Person p = (Person)obj;
		return this.name.equals(p.name) && this.age == p.age;
		
	}

	public String toString() {
		return name+":"+age;
	}
	
}

[David:10, abc]


ex11_12

링크텍스트

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

public class Ex11_12 {

	public static void main(String[] args) {
		HashSet setA = new HashSet();
		HashSet setB = new HashSet();
		HashSet setHap = new HashSet();
		HashSet setGyo = new HashSet();
		HashSet setCha = new HashSet();
		
		setA.add("1"); setA.add("2"); setA.add("3");
		setA.add("4"); setA.add("5");
		System.out.println("A = "+setA);
		
		setB.add("4"); setB.add("5"); setB.add("6");
		setB.add("7"); setB.add("8");
		System.out.println("B = "+setB);
		
		//**간단하게 메소드활용하면??
//		setA.retainAll(setB); 교집합
//		setA.removeAll(setB); 차집합
//		setA.addAll(setB);	합집합
//		System.out.println(setA);
		
		//교집합..*B의 요소 하나하나를 A와 비교하기
		//둘의 위치는 바꿔도 된당!
		Iterator it = setB.iterator();
		while(it.hasNext()) {
			Object tmp = it.next();
			if(setA.contains(tmp))//***A 기준
				setGyo.add(tmp);
		}
		System.out.println("A∩B = "+setGyo);
		
		//차집합..***A-B이면, A의 요소 하나하나를 B와 비교하기
		it = setA.iterator();//**it는 한번만!!
		while(it.hasNext()) {
			Object tmp = it.next();
			if(!setB.contains(tmp))
				setCha.add(tmp);
		}
		System.out.println("A-B = "+setCha);
		
		//합집합..***각각 넣으면 됨. 왜?? 중복허용 안하니까!!
		it = setB.iterator();
		while(it.hasNext())
			setHap.add(it.next());
		
		it = setA.iterator();
		while(it.hasNext())
			setHap.add(it.next());
		System.out.println("A∪B = "+setHap);
	}

}

A = [1, 2, 3, 4, 5]
B = [4, 5, 6, 7, 8]
A∩B = [4, 5]
A-B = [1, 2, 3]
A∪B = [1, 2, 3, 4, 5, 6, 7, 8]



Ref

0개의 댓글