Set계열 자료구조

이한수·2022년 8월 5일
0

자료구조

목록 보기
2/3
post-thumbnail

참고 : https://coding-factory.tistory.com/555

Set 특징

  • 순서를 지키지 않습니다.
  • 중복을 허용하지 않습니다.
  • Hash값을 이용하며 , 탐색에 빠릅니다.

🚗HashSet


//선언
HashSet<String> set = new HashSet<>();

//추가
set.add("나는");

//삭제
set.remove("나는");

//모든 값 제거
set.clear();

//크기
set.size();

//가져오기
//하나의 객체를 가져오기 위해서 , HashSet은 순서가 없기에 
//Iterator를 사용하여야 합니다.
Iterator iterator = set.iterator();
while(iterator.hasNext()){
	System.out.println(iterator.next());
}

//값이 있는지 확인(true/false)
set.contains("나는");

🚗TreeSet

  • HashSet과 달리 이진 탐색 트리 구조로 이루어져 있습니다.

이진 탐색 트리??

  • 추가와 삭제에는 시간이 걸리지만 , 정렬 및 검색에 높은 성능을 보입니다.
    그렇기에 HashSet보다 데이터의 추가와 삭제는 시간이 더 걸리지만 정렬과 검색에는 유리합니다.

  • TreeSet은 이진탐색트리 중에서도 성능을 향상시킨 레드-블랙 트리로 구현되어 있습니다.

정렬 방식 지정하기

  • String , Integer같은 클래스들은 이미 내부에 정렬방식이 구현되어 있으므로 , 그냥 사용해도 됩니다.

만일 , Member같은 개인이 작성한 객체로 TreeSet을 이용하기 위해서는 Comparable인터페이스를 상속받아 compareTo() 메소드를 구현해야 합니다.

즉, TreeSet에 노드를 추가할 때 어떤 기준으로 노드를 비교하여 형성할 것인지 처리를 해줘야 합니다.

//member
public class Member implements Comparable<Member>{
	private Integer id;
    private String username;
    
    public Member(Integer id , String username){
    		this.id = id;
            this.username = username;
    }
    
    @Override
    public int compareTo(Member member){
    	return (this.id - member.id);
    }
    
}

위와 같이 정수값을 기준으로 정렬을 구현할 경우,
양수값이 나오면 비교 대상이 더 크다는 의미로, 부모 노드의 오른쪽에 배치되고 , 음수 값이 나오면 부모 노드의 왼쪽에 배치됩니다.

compareTo메소드는 TreeSet에 요소를 추가할 떄 호출됩니다.

그럼 정렬 조건이 구현된 것은 재구현이 불가능한가?

아닙니다.
Comparator 인터페이스를 상속 받아 compare() 메서드를 구현하면 가능합니다.

//MyCustomString
//String은 final클래스로 상속이 불가합니다.

public class MyCustomString implements Comparator<String>{

    @Override
    public int compare(String s1 , String s2){
    //String이 이미 구현한 compareTo에 음수를 곱하여 
    //내림차순으로 정렬 처리.
    
    	return (s1.compareTo(s2)) * -1;
    }
    
}

//사용시 주의 사항
TreeSet<String> str = new TreeSet<>();		//이미 구현된 정렬 조건 사용

TreeSet<String> str = new TreeSet<>(new MyCustomString());
//매개변수로 구현한 것을 넘겨주어야 적용됩니다.

전달되는 2 매개변수를 이용하여 비교합니다.

 //선언
TreeSet<Integer> tree = new TreeSet<>();

 //추가
 tree.add(1);    //내부에 값이 없다면 추가한뒤 true반환.
 
 //삭제
 tree.remove(1);	
 
 //모두 삭제
 tree.clear();

 //크기
 tree.size();
 
 //가져오기 (최솟값)
 tree.first();
 
 //가져오기 (최댓값)
 tree.last();
 
 //가져오기 (특정 값 이상에서 최솟값 , 없으면  null)
 tree.higer(3);
 
 //가져오기 (특정값 이하에서 최대값 , 없으면 null)
 tree.lower(3);
 
 //값이 있는지 확인(true/false)
 tree.contains(1);
profile
성실하게

0개의 댓글