GiantStepDEV

Comparable<T> μΈν„°νŽ˜μ΄μŠ€?

  • 클래슀 정렬을 κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ©°, TreeSet μ»¬λ ‰μ…˜μ—μ„œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 자기 μžμ‹ κ³Ό 전달받은 λ§€κ°œλ³€μˆ˜λ₯Ό λΉ„κ΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€
  • CompareTo() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•΄μ„œ 정렬쑰건을 κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

compareTo()

λ°˜ν™˜ κ°’

  1. μ–‘μ˜ μ •μˆ˜ : μ •λ ¬ 쑰건
  2. 음의 μ •μˆ˜ : ν˜„ μƒνƒœ μœ μ§€
  3. 0 : 두 객체가 λ™μΌν•˜λ‹€λŠ” 의미둜 Set νŠΉμ„±μ— μ˜ν•΄ ν•΄λ‹Ή 객체가 ν‘œμ‹œ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, 이 κ²½μš°μ—λŠ” ν•˜μœ„ 쑰건을 μΆ”κ°€ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.

🐢예제1

public class CarSort implements Comparable<CarSort> {
    String modelName;
    int modelYear;
    String color;

    public CarSort(String modelName, int modelYear, String color) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
    }

    @Override
    public int compareTo(CarSort o) {
        if(this.modelYear == o.modelYear) {
            return this.modelName.compareTo(o.modelName); 
        }
        return this.modelYear - o.modelYear; // μ•žμ΄ 뒀보닀 크면 μ •λ ¬ (μ˜€λ¦„μ°¨μˆœ)
    }
}
compareTo()
* λ¬Έμžμ—΄μΌ 경우, μ•„μŠ€ν‚€μ½”λ“œλ‘œ 비ꡐ함
* μ •λ ¬μ‘°κ±΄λ§Œ λ„£μ–΄μ£Όλ©΄ μ‹€μ œ 정렬은 λ‚΄λΆ€μ—μ„œ μ²˜λ¦¬ν•΄μ€Œ(quick sort)
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        TreeSet<CarSort> ts = new TreeSet<>();
        ts.add(new CarSort("ν…ŒμŠ¬λΌ", 2023, "Red"));
        ts.add(new CarSort("μ½”λ‚˜", 2019, "White"));
        ts.add(new CarSort("EV6", 2021, "White"));
        ts.add(new CarSort("티볼리", 2021, "Blue"));

        for(CarSort e : ts) {
            System.out.println("λͺ¨λΈλͺ… : " + e.modelName + " / 연식 : " + e.modelYear + " / 색상 : " + e.color);
        }
    }
}
λͺ¨λΈλͺ… : μ½”λ‚˜ / 연식 : 2019 / 색상 : White
λͺ¨λΈλͺ… : EV6 / 연식 : 2021 / 색상 : White
λͺ¨λΈλͺ… : 티볼리 / 연식 : 2021 / 색상 : Blue
λͺ¨λΈλͺ… : ν…ŒμŠ¬λΌ / 연식 : 2023 / 색상 : Red

Comparator<T> μΈν„°νŽ˜μ΄μŠ€?

  • μ—­μ‹œ 클래슀 정렬을 κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ©°, TreeSet μ»¬λ ‰μ…˜μ—μ„œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • λ§€κ°œλ³€μˆ˜μ—μ„œ 전달받은 2개의 객체λ₯Ό λΉ„κ΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€
  • Compare() λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•΄μ„œ 정렬쑰건을 κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

compare()

λ°˜ν™˜ κ°’

  1. μ–‘μ˜ μ •μˆ˜ : μ •λ ¬ 쑰건
  2. 음의 μ •μˆ˜ : ν˜„ μƒνƒœ μœ μ§€
  3. 0 : 두 객체가 λ™μΌν•˜λ‹€λŠ” 의미둜 Set νŠΉμ„±μ— μ˜ν•΄ ν•΄λ‹Ή 객체가 ν‘œμ‹œ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, 이 κ²½μš°μ—λŠ” ν•˜μœ„ 쑰건을 μΆ”κ°€ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.
public class Fruit {
    String name;
    int price;

    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }
}
import java.util.Comparator;

public class DescendComp implements Comparator<Fruit> {
    @Override
    public int compare(Fruit o1, Fruit o2) {
        if(o1.price == o2.price) {
            return o1.name.compareTo(o2.name);
        }
        return o2.price - o1.price; // 큰 κ°’ λΆ€ν„° μž‘μ€ κ°’ μˆœμ„œλ‘œ μ •λ ¬ (λ‚΄λ¦Όμ°¨μˆœ)
    }

    @Override
    public Comparator<Fruit> reversed() {
        return Comparator.super.reversed();
    }
}
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        TreeSet<Fruit> ts = new TreeSet<>(new DescendComp());
        ts.add(new Fruit("포도", 5500));
        ts.add(new Fruit("사과", 12000));
        ts.add(new Fruit("λ”ΈκΈ°", 16000));
        ts.add(new Fruit("λ°”λ‚˜λ‚˜", 5500));

        for(Fruit e : ts) {
            System.out.println(e.name + " / " + e.price);
        }
    }
}
TreeSet<Fruit> ts = new TreeSet<>(new DescendComp());
객체 μƒμ„±μ‹œ Comparator μ •λ ¬ 쑰건을 λ„£μ–΄μ£ΌλŠ” μ΄μœ λŠ”?
Comparator provided at set creation time, depending on which constructor is used.
- 좜처 : Oracle Java SE 11 & JDK 11

πŸΈμ‹€μŠ΅μ˜ˆμ œβœοΈ

문제 : λ¨Όμ € ν•™μƒμ˜ 수λ₯Ό μž…λ ₯ λ°›λŠ”λ‹€. ν•™μƒμ˜ 수 만큼 이름, 성적, ν•™λ²ˆμ„ μž…λ ₯λ°›μ•„ ν•™μƒμ˜ 성적이 높은 순으둜 κ²°κ³Όλ₯Ό ν‘œμ‹œν•˜κ³ , 성적이 κ°™μœΌλ©΄ ν•™λ²ˆ 순으둜 μ •λ ¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. (좜λ ₯μ‹œ λ“±μˆ˜λ„ ν‘œμ‹œλ˜λ„λ‘)

 

μž…λ ₯ μ˜ˆμ‹œ :

학생 수 : 3

μ•ˆλ•‘λ•‘ 54 202301

κΉ€μ›…λ‹ˆ 88 202303

μ΅œλ•‘λ–™ 72 202302

 

좜λ ₯ μ˜ˆμ‹œ:

====== 학생 성적 좜λ ₯ ======

------------------------------------------

석차     μ΄λ¦„      성적      ν•™λ²ˆ

  1       κΉ€μ›…λ‹ˆ     88      202303

  2       μ΅œλ•‘λ–™     72      202302

  3       μ•ˆλ•‘λ•‘     54      202301

------------------------------------------

public class Student implements Comparable<Student> {
    String name;
    int score;
    String studentNum;

    public Student(String name, int score, String studentNum) {
        this.name = name;
        this.score = score;
        this.studentNum = studentNum;
    }

    @Override
    public int compareTo(Student o) {
        if(this.score == o.score) {
            return this.studentNum.compareTo(o.studentNum);
        }
        return o.score - this.score;
    }
}
import java.util.Scanner;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        TreeSet<Student> ts = new TreeSet<>();
        Scanner sc = new Scanner(System.in);
        System.out.print("학생 수 : ");
        int num = sc.nextInt();
        for (int i = 0; i < num; i++) {
            String name = sc.next();
            int score = sc.nextInt();
            String studentNum = sc.next();
            ts.add(new Student(name, score, studentNum));
        }
        System.out.println("  < 학생 성적 좜λ ₯  >  ");
        System.out.println("---------------------------");
        System.out.println("석차    이름    성적    ν•™λ²ˆ");
        System.out.println("---------------------------");
        int grade = 0;
        for (Student e : ts) {
            grade++;
            System.out.println(" " + grade + "    " + e.name + "     " + e.score + "    " + e.studentNum);
        }
    }
}
profile

GiantStepDEV

@kongmi

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!