본문 바로가기

Java

[Java] HashSet 객체 중복제거, 집합

목차

  • set의 구현클래스
  • HashSet과 TreeSet
  • HashSet의 주요 메서드
  • HashSet 예제

 

 

Set - 순서X, 중복X

대표적인 구현 클래스: HashSet, TreeSet

 

남궁성 유튜브 출처: https://www.youtube.com/watch?v=JYcFX4O2kqM

 

 

 

 

HashSet

Set 인터페이스를 구현한 대표적인 컬렉션 클래스

순서를 유지하려면, LinkedHashSet

 

 

 

TreeSet

범위 검색과 정렬에 유리한 컬렉션 클래스

HashSet 보다 데이터 추가, 삭제에 시간이 더 걸림(데이터가 많을수록)

 

 

 

HashSet  주요 메서드

 

HashSet( ): 생성자

HashSet(Collection c): 컬렉션의 모든 객체 저장

HashSet(int initialCapacity): 초기용량

HashSet(int initialCapacity, float loadFactor): 초기용량, 언제 늘릴것 인가?(0.8 => 80% => x2)

 

 

retainAll(Collection c): 컬렉션에 들어있는 것 뺴고 삭제(차집합)

 

 

 

 

 

 

 

 

 

 

예제

public class HashSetEx1 {

    public static void main(String[] args) {
        Object[] objArr = {"1", Integer.valueOf(1), "2", "2", "3", "3", "4", "4"};
        Set set = new HashSet();

        for (int i = 0; i < objArr.length; i++) {
            set.add(objArr[i]); // HashSet에 objArr의 요소들을 저장한다.
        }
        // HashSet에 저장된 요소들을 출력한다.
        System.out.println(set);

        // HashSet에 저장된 요소들을 출력한다(Iterator이용)
        Iterator it = set.iterator();

        while (it.hasNext()) {
            Object obj = it.next();
            System.out.println(obj);
        }
    }
}
[1, 1, 2, 3, 4]
1
1
2
3
4

 

순서를 유지하지 않고, 중복된 요소가 추가되는 것을 허용하지 않는다.

 

 

public class HashSetEx2 {

    public static void main(String[] args) {
        Set set = new HashSet();

        for (int i = 0; set.size() < 6; i++) {
            int num = (int)((Math.random() * 45) + 1); // 1~45
            set.add(new Integer(num)); // 정렬되지 않은 상태
        }

        List list = new LinkedList(set); // LinkedList(Collection c), set의 요소들을 List에 저장
        Collections.sort(list); // Collections.sort(), list를 정렬
        System.out.println(list); // list를 출력
    }
}
[2, 9, 27, 29, 34, 40]

 

 

 

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

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

 

boolean add(Object o)는 저장할 객체의 equals( )와 hashCode( ) 호출(중복인지 아닌지 확인)

HashSet에 저장하려면 equals( )와 hashCode( )가 오버라이딩 되어 있어야함(Object를 상속받아야 함)

 

public class HashSetEx3 {

    public static void main(String[] args) {
        Set set = new HashSet();
        set.add("abc");
        set.add("abc");
        set.add(new Person("David", 10));
        set.add(new Person("David", 10));

        System.out.println(set);
    }
}

class Person extends Object {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return name + " : " + age;
    }
}
[abc, David : 10, David : 10]

 

 

public class HashSetEx3 {

    public static void main(String[] args) {
        Set set = new HashSet();

        set.add("abc");
        set.add("abc");
        set.add(new Person("David", 10));
        set.add(new Person("David", 10));

        System.out.println(set);
    }
}

class Person extends Object {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public int hashCode() {
		// return (name + age).hashCode();
        // int has(Object... values); // iv(객체를 구분하는 기준) 가변인자
        return (name + age).hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Person)) return false;

        Person p = (Person) obj;

        return this.name.equals(p.name) && this.age == p.age;
    }
}

 

 

public class HashSetEx4 {

    public static void main(String[] args) {

        HashSet setA = new HashSet();
        HashSet setB = new HashSet();
        HashSet setHab = new HashSet();
        HashSet setKyo = 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);

        // 교집합
        Iterator it = setB.iterator();
        while (it.hasNext()) {
            Object tmp = it.next();
            if (setA.contains(tmp)){
                setKyo.add(tmp);
            }
        }
        System.out.println("교집:" + setKyo);
        
        // 차집합
        it = setA.iterator();
        while (it.hasNext()) {
            Object tmp = it.next();
            if (!setB.contains(tmp)){ // SetB에 없는 것만 차집합에 저장
                setCha.add(tmp);
            }
        }
        System.out.println("차집:" + setCha);
        
        // 합집합
        it = setA.iterator();
        while (it.hasNext()) {
            setHab.add(it.next());
        }
        it = setB.iterator();
        while (it.hasNext()) {
            setHab.add(it.next());
        }
        System.out.println("합집:" + setHab);
        
    }
}
setA.retainAll(setB); // 교집합 공통된 요소만 남기고 삭제
setA.addAll(setB); // 합집합. setB의 모든 요소를 추가(중복제외)
setA.removeAll(setB); // 차집합. setB와 공통요소 제거
B = [4, 5, 6, 7, 8]
교집:[4, 5]
차집:[1, 2, 3]
합집:[1, 2, 3, 4, 5, 6, 7, 8]