Java/Java 문법

Set

열심히 해 2024. 9. 16. 20:29

Set : 순서가 없는 데이터의 집합 (데이터 중복 허용 안함) - 순서 없고 중복 없는 배열, 즉 순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조.

 

  • HashSet : 가장 빠르며 순서를 전혀 예측할 수 없음
  • TreeSet : 정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음. 디폴트는 오름차순.
  • LinkedHashSet : 추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능

 

더보기
public class col5 {
    public static void main(String[] args) {
        // Set은 집합. 순서 없고 중복 없음. 생성자가 없는 껍데기라서 바로 생성할 수 없음.
        Set<Integer> intSet = new HashSet<Integer>(); // 선언 및 생성

        intSet.add(3);
        intSet.add(6);
        intSet.add(9);
        intSet.add(2);
        intSet.add(5);
        intSet.add(3);
        intSet.add(6);
        intSet.add(9);

        for(Integer value: intSet){
            System.out.println(value);
        }
        System.out.println(intSet.contains(5)); // intSet은 5를 포함하고 있니? true
        System.out.println(intSet.contains(7)); // intSet은 7을 포함하고 있니? false
    }
}

 

 

- 특징
    - 순서가 보장되지 않는 대신 중복을 허용하지 않도록 유지할 수 있습니다.
    - `Set`은 그냥 `Set`으로 쓸 수도 있지만 `HashSet`, `TreeSet` 등으로 응용하여 사용할 수 있습니다.
    - `Set`는 생성자가 없는 껍데기라서 바로 생성할 수는 없습니다. (껍데기 = 인터페이스)
    - 생성자가 존재하는 클래스인 `HashSet` , `TreeSet `, `LinkedHashSet `를 사용하여 `Set`를 생성해서 받을 수 있습니다.

 

- 기능
    - 선언 : `Set<Integer> intSet` 형태로 선언합니다.
    - 생성 : `new HashSet<Integer>();` 형태로 생성합니다.
    - 추가 : `intSet.add({추가할 값})` 형태로 값을 맨 위에 추가합니다.
    - 삭제 : `intSet.remove({삭제할 값})` 형태로 삭제할 값을 직접 지정합니다.
    - 포함 확인 : `intSet.contains({포함 확인 할 값})` 형태로 해당 값이 포함되어있는지 boolean 값으로 응답받습니다.

 

 


 

위가 Set에 대한 전반적인 내용이다.

 

'순서가 없다, 순서가 보장되지 않는다'는 의미는 출력했을 때 순서를 랜덤하게 제공한다는 뜻이 아니다.

 

HashSet<Integer> hashIntSet = new HashSet<>();
hashIntSet.add(1);
hashIntSet.add(5);
hashIntSet.add(7);
hashIntSet.add(9);
hashIntSet.add(3);
System.out.println(hashIntSet);  //  [1, 3, 5, 7, 9]

 

1, 5, 7, 9, 3 순으로 추가했다 하더라도 출력 결과는 항상 오름차순인 [1, 3, 5, 7, 9] 이다. 

 

 

ArrayList<Integer> numberList = new ArrayList<>(hashIntSet);
System.out.println(numberList);

 

HashSet에서 ArrayList로 형변환을 시켜도 출력 결과는 항상 [1, 3, 5, 7, 9]  이다.

 

 

정말 순서가 난잡한 배열을 만드려면 어떻게 해야할까 ? LinkedHashSet 을 사용하면 된다. 

 

LinkedHashSet<Integer> hashIntSet = new LinkedHashSet<>();
hashIntSet.add(1);
hashIntSet.add(5);
hashIntSet.add(7);
hashIntSet.add(9);
hashIntSet.add(3);
System.out.println(hashIntSet);  //  [1, 5, 7, 9, 3]

ArrayList<Integer> numberList = new ArrayList<>(hashIntSet);
System.out.println(numberList);  //  [1, 5, 7, 9, 3]

'Java > Java 문법' 카테고리의 다른 글

scanner.next() , scanner.nextInt() , scanner.nextLine()  (0) 2024.09.23
for문을 통해 Map을 순회하기  (0) 2024.09.19
Java에서 난수 만들기  (0) 2024.09.13
Java 문법 10 (제네릭)  (0) 2024.09.10
Java 문법 9 (오류 및 예외)  (0) 2024.09.09