일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 식별자
- 산술 연산자
- 이클립스 설치
- 반복문
- StringBuffer
- 스프링시큐리티 로그아웃
- java
- 논리 연산자
- 친절한 SQL 튜닝
- 예약어
- 객체지향
- @PreAuthorize("isAuthenticated()")
- 배열
- 오버라이딩
- join
- 자바의정석
- 인텔리제이 Web 애플리케이션
- 함수
- 비교 연산자
- 상속
- 객체
- 연산자
- SpringSecurity 로그아웃
- spring 게시판 삭제
- 친절한 SQL
- 오버로딩
- SQL튜닝
- SpringSecurity 로그인
- SQL
- SQL 튜닝
- Today
- Total
gi_dor
[Java] Comparator - compare(o1,o2) , Comparable - compareTo(o) , HashSet,TreeSet 본문
[Java] Comparator - compare(o1,o2) , Comparable - compareTo(o) , HashSet,TreeSet
기돌 2023. 4. 5. 21:0120230405
뭐가 이렇게 알아야할 메서드가 많은거야...
컬렉션이 뭔지 아직도 모르는데.
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 )
이진트리의 모든 노드를 한번씩 읽는 것을 트리 순회 라고한다
'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 |