gi_dor

[Java] Comparator - compare(o1,o2) , Comparable - compareTo(o) , HashSet,TreeSet 본문

First/Java

[Java] Comparator - compare(o1,o2) , Comparable - compareTo(o) , HashSet,TreeSet

기돌 2023. 4. 5. 21:01
20230405
뭐가 이렇게 알아야할 메서드가 많은거야...
컬렉션이 뭔지 아직도 모르는데.

Comparator 와 Comparable

* 이곳은 다시 공부 해야겠다.

참고: https://st-lab.tistory.com/243  

Comparator와 Comparable은 인터페이스 
내가 알고 있는 인터페이스는 일종의 추상 클래스 , 미완성 설계도로 알고있다 (아직 7 장 뒷부분 공부 덜했음..)

그렇다면 이것들을 사용 하기위해서는  내부에 있는 메서드를 구현 해줘야 사용 할수가있다 implements

Comparable 인터페이스를 사용하려면  compareTo(Object o )메서드를 구현을 해줘야한다
Comparatot 인터페이스를 사용하려면 compare( Object o1 , Object o2 )메서드를 구현

기초편 420p 에는 인터페이스로 컬렉션을 정렬하는데 필요한 메서드 라고 정의  ~ 밑에 예제를 보면 비교 라는 글이있다

public interface Comparator {
	int compare ( Object 01, Object 02); // o1 과 o2 비교
    }
    
  public interface Comparable {
  int compareTo(Object o);  // 객체자신 this 와 o 를 비교
  }

Comparable은 자기 자신 this와 매개변수 를 비교
Comparator 는 매개변수 일단 2개 받고 그 두개로 비교

 

[ Comparable ] 
1. 자기 자신과 매개변수를 비교
2. compareTo 매서드 를 반두시 구현 

[ Comparator ]
1. 두 매개변수를 비교
2. compare 매서드를 반드시 구현

비교하는 대상 ( this.x , o ) , ( o1 , o2 )  중 왼쪽이 크면 음수 , 오른쪽이 크면 양수 , 둘이 같다면 0 

✔ 정렬 대상
✔ 정렬할 기준이 있어야함


package day02;

import java.util.*;

public class day230405_01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

			// 기초편 p421 예제 11-7 Comparator , Comparable
		
		String[] strArr = { "cat", "Dog", "lion", "tiger" };
		// String배열
		Arrays.sort(strArr); // 정렬 
		System.out.println("strArr = "+Arrays.toString(strArr));
		// 대문자 소문자 중에 대문자 먼저 출력함
		
		Arrays.sort(strArr,String.CASE_INSENSITIVE_ORDER); 
		System.out.println("strArr = "+Arrays.toString(strArr));
		// String.CASE_INSENSITIVE_ORDER 정렬 기준
        // strArr 은 정렬 대상
		
		Arrays.sort(strArr, new Descending()); //역순 정렬
		System.out.println("strArr = "+Arrays.toString(strArr));
        // new Descending() 정렬 기준
        // strArr  정렬 대상
	}

}

class Descending implements Comparator {  // Comparator 인터페이스를 구현
	public int compare( Object o1, Object o2) { //매개 변수 2개를 비교
		if ( o1 instanceof Comparable && o2 instanceof Comparable) {
			Comparable c1 = (Comparable) o1;
			Comparable c2 = (Comparable) o2;
			return c1.compareTo(c2) * -1 ;  // c1.compareTo 기본정렬기준
			}	
		return -1;
	}
}

 

 


 

HashSet

Set 인터페이스를 구현한 컬렉션클래스
Set인터페이스 특징으로 순서유지 x , 중복허용 x 
add메서드로 요소를 추가 하는대신 이미 저장되어있는 값을 또 추가한다면 false 반환 

저장순서를 유지 하고싶다면 LinkedHashSet 사용 

HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인
같은 객체가 없으면 저장 , 있으면 저장x
ex )  boolean add ( Object o ) 는 저장할 객체의 equals() 와 hashCode() 호출 

HashSet 주요메서드, 생성자

HashSet() // 생성자
HashSet( int initialCapacity)  // 초기용량 2배
boolean add (Object o) // 추가
boolean addAll(Collection c) 
boolean remove(Object o)  // 삭제
boolean removeAll(Collection c)
boolean retainAll(Collection c) // 조건부삭제
void clear()  // 모두삭제
boolean contains(Object o)  // 포함되어있는지 true/false반환
Iterator iterator()  // 요소 읽어오기
boolean isEmpty()  // 비어있는지 확인
int size()  // 저장된 객체 수
Object[] to Array() //  저장되어있는 객체를 객체배열로 반환

 


package day02;

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

public class day230405_03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 기초편 p425 예제 11-9 HashSet 예제 1
		Object[] obj = { "1" , new Integer(1) , "2","2","3","3","3","4","4"};
		Set s = new HashSet();
		// "1" String , new Integer(1) 은 Int 이기 때문에 중복으로 치지 않음
		
		for ( int i = 0; i < obj.length; i++) {
			System.out.println(obj[i] +"="+ s.add(obj[i]));  // 0 1 2 3 4 5 6 7 8 9 
		}
		// obj 배열은 중복 값이있는 객체가 포함되어있음
		// 그래서 HashSet 사용해서 obj 객체의 중복을 제거한 객체 Set을 만들기 위해 사용하는거임 
		System.out.println(s);
		
		Iterator it = s.iterator();
		
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}

}
package day02;

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

public class day230405_04_HashSet {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// p426 기초편 예제 11-10 HashSet
		
		Set s = new HashSet();
         // Set a = new Set(); 에러 왜 ? Set은 인터페이스 잖아.. 인터페이스는 혼자 객체 못만들어..
         // HashSet a = new HashSet(); ok
		
		for ( int i = 0; s.size()<6;i++) { 
			// 0 1 2 3 4 5에 6개 랜덤난수 담을때 까졍 반복
			int num = ( int)(Math.random()*45)+1;
			s.add(new Integer(num));
			
		}
		List l = new LinkedList(s);
		// List 인터페이스에서 LinkedList 클래스로 구현 
		// 매개변수로 HashSet()을넘겨주고 s에 들어있는 요소로 LinkedList() 객체 l 만듬
		// List특징이 순서 o 중복o 중복값은 없으니 순서에 맞게 정리해줌
		
		Collections.sort(l); 
		// Collections 클래스  
		// sort()는 Collections 클래스에서 주어진 정렬 메서드
		// sort() 메서드가 웃긴게 Comparable 인터페이스에있는 compareTo() 메서드를 호출함
		
		System.out.println(l);
	}

}

TreeSet

▪ 이진 탐색트리로 구현 (binary search tree) ,   범위 검색과 정렬에 유리함  from ~ to  

▪  이진트리는 모든 노드가 최대 2개 ( 0 ~ 2개 )의 하위 노드 (자식노드) 를 갖음
    각 요소가 (node) 나무 형태 (tree) 로 연결  (LinkedListd 의 변형)
     HashSet보다 데이터 추가 삭제에 시간이 더걸림

class TreeNode{	// LinkedList의 변형
	TreeNode left;	// 왼쪽 자식노드
    Object element;	// 저장할 객체
    TreeNode right;	// 오른쪽 자식 노드
    }
    
    
    // LinkedList
    class Node{
    	Node next; // 다음 요소의 주소를 저장
        Object obj;	//  데이터를 저장
        }




이진 탐색트리 (binary search tree)

▪ 부모보다 작은 값은 왼쪽 , 큰 값은 오른쪽에 저장
▪ 단점 : 데이터가 많아질수록 추가,삭제에 시간이 더 걸림 ( 비교하는 횟수가 증가 )

TreeSet 주요 메서드, 생성자

// 생성자
TreeSet()  // 기본 생성자    , Comparable
TreeSet( Collection c) // 주어진 컬렉션을 저장하는 TreeSet 생성
TreeSet( Comparator comp ) // 주어진 정렬 기준으로 정렬하는 TreeSet생성
// Comparator 비교기준 제공 


Object first ()  정렬된 순서에서 첫번째 객체 반환 // 제일 작은거
Object last () 정렬된 순서에서 마지막 객체 반환 // 제일 큰거

Object celling (Object o) // 올림 
// 지정된 객체와 같은 객체를 반환 , 없으면  큰값을 가진 객체중 제일 가까운값의 객체를 반환
// 30 40 50 넣고 45 입력시 50 나옴

Object floor (Object o) // 버림 
// 지정된 객체와 같은 객체를 반환 , 없으면 작은 값을 가진 객체중 제일 가까운 값의 객체를 반환
// 30 40 50 넣고  35입력시 30 나옴

Object higher ( Object o ) 
// 지정된 객체보다 큰값을 가진 객체중 제일 가까운 값의 객체를 반환 없으면 null
// 30 40 50 넣고 40 입력 50 나옴 

Object lower(Object o ) 
// 지정된 객체보다 작은 겂을 가진 객체중 제일 가까운 값의 객체를 반환 없으면 null
// 30 40 50 넣고 40 입력 30 나옴
 
SortedSet subSet (Object fromElement ,  Object toElement ) 
// 범위 검색  from ~ to   from <= x < to

SortedSet headSet ( Object toElement) 
// 지정된 객체보다 작은 값의 객체들을 반환

SorterSet tailSet ( Object fromElement ) 
// 지정된 객체보다 큰값의  객체들을 반환

package day02;

import java.util.TreeSet;

public class day230405_09_TreeSet3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// p435 기초편 예제 11-15
		
		TreeSet tr = new TreeSet();
		// Set tr = new TreeSet(); 에러 
		// 왜 ? subSet , headSet , tailSet 이 TreeSet에만 존재함
		
		
		int[] score = { 80,95,50,35,45,65,10,100};
		
		for (int i = 0; i<score.length; i++) {
			tr.add(new Integer(score[i]));
		}
		System.out.println("50보다 작은 값: "+ tr.headSet(new Integer(50)));
//		System.out.println("50보다 작은 값: "+ tr.headSet(50)  );
		
		System.out.println("50보다 큰 값: "+ tr.tailSet(new Integer(50)));
//		System.out.println("50보다 큰 값: "+ tr.tailSet(50) );
		
		System.out.println("40과 80 사이의 값 : "+tr.subSet(40,80));
		// 40 <= x < 80  from40 to 80
		
//		SortedSet headSet ( Object toElement) 
//		// 지정된 객체보다 작은 값의 객체들을 반환

		//		SorterSet tailSet ( Object fromElement ) 
//		// 지정된 객체보다 큰값의  객체들을 반환
	}

}

 

package day02;

import java.util.TreeSet;

public class day230405_08_TreeSet2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// p434  기초판 예제 11-14
	
		TreeSet ts = new TreeSet();
		// 범위검색에 유리함( from ~ to)
		
		
		String from ="b";
		String to = "d";
		
		ts.add("abc");
		ts.add("ailen");
		ts.add("bat");
		ts.add("car");
		ts.add("Car");
		ts.add("disc");
		ts.add("dance");
		ts.add("dZZZZ");
		ts.add("dzzzz");
		ts.add("elephant");
		ts.add("elevator");
		ts.add("fan");
		ts.add("flower");
		
		System.out.println(ts);
		System.out.println("range search : from "+from+" to "+to);
		System.out.println("result01 : "+ ts.subSet("b","f") );
		System.out.println("result02 : "+ ts.subSet(from, to+"zzz") );
		
		


}

 


+ 트리순회  ( tree traversal )

이진트리의 모든 노드를 한번씩 읽는 것을 트리 순회 라고한다

728x90

'First > Java' 카테고리의 다른 글

[Java] CH 11 컬렉션 프레임웍  (0) 2023.06.09
[Java] CH9 java.lang패키지와 클래스  (0) 2023.04.08
[Java] CH8 예외처리  (0) 2023.04.02
[Java] 6장 QUIZ  (0) 2023.03.21
[Java] CH7 객체지향 개념  (0) 2023.03.20