λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Study/Java

[TIL] Set<E>

by hong- 2022. 5. 17.

πŸ™πŸ» Set

(1) μš”μ†Œμ˜ μ €μž₯ μˆœμ„œλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠμŒ
(2) 같은 μš”μ†Œμ˜ 쀑볡 μ €μž₯을 ν—ˆμš©ν•˜μ§€ μ•ŠμŒ

 - 쀑볡 x, μˆœμ„œ x 인 μ§‘ν•©


πŸ‘πŸ» HashSet

- ν•΄μ‹œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ 검색 속도 맀우 빠름

- HashMap μΈμŠ€ν„΄μŠ€λ₯Ό μ΄μš©ν•˜μ—¬ μš”μ†Œλ₯Ό μ €μž₯

- Set을 κ΅¬ν˜„ν•˜λ―€λ‘œ μˆœμ„œ 상관 없이 μ €μž₯ν•˜κ³  쀑볡 κ°’ μ €μž₯ μ•ˆν•¨

- add( )λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λ©΄ κ²°κ³ΌλŠ” true, false ! 즉, μžˆλ‹€λ©΄ false λ„μΆœ

package Mon;

import java.util.*;

public class HashSetTest {
    public static void main(String[] args) {
        HashSet<String> lan = new HashSet<String>();

        lan.add("Apple");
        lan.add("Banana");
        lan.add("Melon");
        lan.add("Strawberry");
        lan.add("Tomato");
        lan.add("Banana");

        Iterator it = lan.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}
//κ²°κ³Ό
Apple
Strawberry
Tomato
Banana		//Set을 κ΅¬ν˜„ν•˜λ―€λ‘œ μˆœμ„œ 상관 없이 μ €μž₯ν•˜κ³  쀑볡 κ°’ μ €μž₯ μ•ˆν•¨
Melon

πŸ‘πŸ» TreeSet

- 데이터가 μ •λ ¬λœ μƒνƒœλ‘œ μ €μž₯λ˜λŠ” 이진 검색 트리의 ν˜•νƒœλ‘œ μš”μ†Œ μ €μž₯

- 데이터λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•˜λŠ” λ“± κΈ°λ³Έ λ™μž‘ μ‹œκ°„ 빠름

- Set을 κ΅¬ν˜„ν•˜λ―€λ‘œ μˆœμ„œ 상관 없이 μ €μž₯ν•˜κ³  쀑볡 κ°’ μ €μž₯ μ•ˆν•¨

- κ²°κ³Όκ°€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 정렬됨

package Mon;

import java.util.TreeSet;

public class TreeSetTEst {
    public static void main(String[] args) {
        TreeSet<String> tree = new TreeSet<>();

        tree.add("Lemon Tree");
        tree.add("Apple Tree");
        tree.add("Christmas Tree");

        System.out.println(tree);
        System.out.println(tree.first());
        System.out.println(tree.last());
        System.out.println(tree.higher("Christmas"));
        System.out.println(tree.subSet("Christmas","Lemon"));
    }
}
//κ²°κ³Ό
[Apple Tree, Christmas Tree, Lemon Tree]
Apple Tree
Lemon Tree
Christmas Tree
[Christmas Tree]

🌱 subSet( E fromElement, toElement )

  - μš”μ†Œ λ²”μœ„κ°€ fromElementμ—μ„œ toElement μ œμ™ΈμΈ 이 μ§‘ν•©μ˜ 뢀뢄보기λ₯Ό λ°˜ν™˜

🌱 higher ( E e ) / lower ( E e )

  - μ£Όμ–΄μ§„ μš”μ†Œλ³΄λ‹€ 더 큰 μ§‘ν•© / μž‘μ€ μ§‘ν•© μš”μ†Œλ₯Ό λ°˜ν™˜


πŸ’‘ 이진 탐색 트리 Binary Search Tree

 - ν•˜λ‚˜μ˜ λΆ€λͺ¨ λ…Έλ“œμ— μ΅œλŒ€ 두 개의 μžμ‹ λ…Έλ“œμ™€ μ—°κ²°λ˜λŠ” 이진 트리의 일쒅

 - μ •λ ¬κ³Ό 검색에 νŠΉν™”λœ 자료 ꡬ쑰

 - λͺ¨λ“  μ™Όμͺ½ μžμ‹ 값이 λΆ€λͺ¨λ³΄λ‹€ μž‘μŒ

 - λͺ¨λ“  였λ₯Έμ‘± μžμ‹ 값이 λΆ€λͺ¨λ³΄λ‹€ 큼 

 

πŸ“ HashSetκ³Ό TreeSet의 κ°€μž₯ 큰 μ°¨μ΄λŠ” ! μ˜€λ¦„μ°¨μˆœ μ •λ ¬ (TreeSet)


πŸ™ŒπŸ» Comparable와 Comparator

 - μ»¬λ ‰μ…˜μ„ μ •λ ¬ν•˜κΈ° μœ„ν•΄ μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€

 - Comparable : 객체 κ°„ 일반적 μ •λ ¬ ν•„μš” μ‹œ, Comparable μΈν„°νŽ˜μ΄μŠ€ ν™•μž₯ν•΄μ„œ μ •λ ¬μ˜ κΈ°μ€€ μ •μ˜ν•˜λŠ” compareTo() κ΅¬ν˜„

 - Comparator : 객체 κ°„ νŠΉμ •ν•œ μ •λ ¬ ν•„μš” μ‹œ, Comparator μΈν„°νŽ˜μ΄μŠ€ ν™•μž₯ν•΄μ„œ νŠΉμ • 기쀀을 μ •μ˜ν•˜λŠ” compare() κ΅¬ν˜„


πŸ“ Comparable κ³Ό Comparator 의 차이점은

1) μ •λ ¬ 기쀀이 일반적 vs μΌλ°˜μ μ΄μ§€ μ•Šλƒ
2) λ©”μ„œλ“œκ°€ compareTo() vs compare()

πŸ‘‰πŸ» Comparable μΈν„°νŽ˜μ΄μŠ€

 - 맀개 λ³€μˆ˜μ™€ 자기 μžμ‹  비ꡐ (λ§€κ°œλ³€μˆ˜ vs μžκΈ°μžμ‹ )

 - 같은 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ„œλ‘œ λΉ„κ΅ν•΄μ•Όλ§Œ ν•˜λŠ” ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€

 - compareTo( )둜 객체 μ˜€λ¦„μ°¨μˆœ μ •λ ¬

    → 두 객체가 κ°™μœΌλ©΄ 0, 비ꡐ 객체가 μž‘μœΌλ©΄ -, 크면 +

package Mon;

import java.util.*;

public class Salad implements Comparable<Salad> {
    int number;
    String kind;
    String sauce;

    public Salad(int number, String kind, String sauce) {
        this.number = number;
        this.kind = kind;
        this.sauce = sauce;
    }

    public int compareTo(Salad salad) {
        if(number > salad.number){
            return 1;
        } else if (number < salad.number) {
            return -1;
        } else {
            return 0;
        }
    }
}
** a.compareTo(b)일 λ•Œ,
 (1) a > b 라면 1을 λ°˜ν™˜
 (2) a == b 라면 0을 λ°˜ν™˜
 (3) a < b 라면 -1을 λ°˜ν™˜
package Mon;

import java.util.Set;
import java.util.TreeSet;

public class ComparableTest {
    public static void main(String[] args) {
        Set<Salad> food = new TreeSet<>();

        Salad salad1 = new Salad(3, "Grilled Chicken","Oriental");
        Salad salad2 = new Salad(2, "Salmon","Sriracha Mayo");
        Salad salad3 = new Salad(1, "Shrimp","lemon");

        food.add(salad1);
        food.add(salad2);
        food.add(salad3);

        for(Salad salad : food){
            System.out.println(salad.number + " " + salad.kind + " " + salad.sauce);
        }
    }
}
//κ²°κ³Ό
1 Shrimp lemon
2 Salmon Sriracha Mayo
3 Grilled Chicken Oriental

πŸ‘‰πŸ»  Comparator μΈν„°νŽ˜μ΄μŠ€

  - 맀개 λ³€μˆ˜μΈ 두 객체λ₯Ό 비ꡐ (λ§€κ°œλ³€μˆ˜ vs λ§€κ°œλ³€μˆ˜)

  - μ‚¬μš©μžκ°€ 직접 Comparator μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ Comparator을 λ§Œλ“€ 수 있음

  -  Comparable (κΈ°λ³Έ μ •λ ¬ κΈ°μ€€)이 μ•„λ‹Œ λ‹€λ₯Έ κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•˜κ³  싢을 λ•Œ μ‚¬μš©

    →  Comparableμ—μ„œ μ΄λ¦„μˆœμœΌλ‘œ 정렬을 이미 ν–ˆλŠ”λ° μ—°λ΄‰μˆœμœΌλ‘œ 보고싢닀면  λ§€ 번 compareTo둜

          μˆ˜μ •ν•  수 없기에 이럴 λ•ŒλŠ” Comparator μ‚¬μš©ν•˜μ—¬ 특수 κΈ°μ€€ 쀄 수 있음

  - compare( )λ₯Ό μ˜€λ²„λΌμ΄λ”©

package Mon;

import java.util.Comparator;

public class SortNum implements Comparator<Salad2> {
    public int compare(Salad2 s1, Salad2 s2){
        return s1.number - s2.number;
    }
}

 - Comparator이 κ°–κ³  μžˆλŠ” ν•¨μˆ˜ compare()λ₯Ό μ˜€λ²„λΌμ΄λ”© ν•˜μ—¬ 객체만의 μ •λ ¬ 쑰건으둜 μž¬μ •μ˜ 

 - compare 의 μ§€μ—­λ³€μˆ˜λ“€μ„ λΉ„κ΅ν•˜λ©° 음수면 μž‘μ€ 것, μ–‘μˆ˜λ©΄ 큰 것, 0이면 같은 κ²ƒμœΌλ‘œ νŒλ‹¨ν•  수 있음

package Mon;

import java.util.ArrayList;
import java.util.Collections;

public class ComparatorTest {
    public static void main(String[] args) {
        ArrayList<Salad2> food = new ArrayList<>();

        Salad2 salad1 = new Salad2(45, "Grilled Chicken", "Oriental");
        Salad2 salad2 = new Salad2(98, "Salmon", "Sriracha Mayo");
        Salad2 salad3 = new Salad2(23, "Shrimp", "lemon");

        food.add(salad1);
        food.add(salad2);
        food.add(salad3);

        for (Salad2 sal : food) {
            System.out.println(sal.number + " " + sal.kind + " " + sal.sauce);
        }

        Collections.sort(food, new SortNum());

        for (Salad2 sal : food) {
            System.out.println(sal.number + " " + sal.kind + " " + sal.sauce);
        }
    }
}

 

 

 - Comparator μΈν„°νŽ˜μ΄μŠ€λ₯Ό SortNum() 클래슀둜 μ •μ˜ν•˜κ³  μ •λ ¬ 기쀀을 μ‚¬μš©

 - μ •λ ¬ν•  λ•ŒλŠ” λ°˜λ“œμ‹œ λ§€κ°œλ³€μˆ˜λ‘œ μ •λ ¬ 기쀀을 μ œκ³΅ν•˜κ±°λ‚˜ λŒ€μƒ 객체 자체적으둜 μ •λ ¬ κΈ°μ€€ κ΅¬ν˜„μ΄ ν•„μš”

//κ²°κ³Ό
45 Grilled Chicken Oriental
98 Salmon Sriracha Mayo
23 Shrimp lemon

23 Shrimp lemon
45 Grilled Chicken Oriental
98 Salmon Sriracha Mayo

🌱 리슀트 μ •λ ¬ Collections.sort ( ) / list.sort( )

//μ˜€λ¦„μ°¨μˆœ
Collections.sort(list);
list.sort(Comparator.naturalOrder());

//λ‚΄λ¦Όμ°¨μˆœ
Collections.reverse(list);
list.sort(Comparator.reverseOrder());

'Study > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[TIL] 자료ꡬ쑰  (0) 2022.05.18
[TIL] Map<K, V>  (0) 2022.05.18
[TIL] List<E>  (0) 2022.05.17
[TIL] μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬  (0) 2022.05.17
[TIL] μΆ”μƒν΄λž˜μŠ€ vs μΈν„°νŽ˜μ΄μŠ€  (0) 2022.05.15