- 정렬 알고리즘
- 복잡도
오른쪽으로 갈수록 오래 걸림 (최악)
static void sort(Object[] a)
: Object[] a
를 오름차순 배열static void sort(Object[] a, int fromIndex, int toIndex)
: Object[] a
의 fromIndex
부터 toIndex-1
까지 오름차순 배열n부터 arr.length까지 정렬
명령하면 됨)import java.util.Arrays;
class SortEx1 {
public static void main(String[] args) {
int[] arr = {2, 6, 7, 3, 9, 5};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
String[] strs = {"apple", "apply", "application", "adapter", "always"};
Arrays.sort(strs);
System.out.println(Arrays.toString(strs));
String[] strs2 = {"가가나", "가가", "가나나", "가가가", "가나다"};
Arrays.sort(strs2);
System.out.println(Arrays.toString(strs2));
}
}
import java.util.Arrays;
class Phone {
private String model;
private int price;
public Phone(String model, int price) {
setModel(model);
setPrice(price);
}
public String getModel() {
return model;
}
public int getPrice() {
return price;
}
public void setModel(String model) {
this.model = model;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return model + "(" + price + ")";
}
}
class SortEx2 {
public static void main(String[] args) {
Phone[] list = {
new Phone("갤럭시20plus", 900000),
new Phone("갤럭시22ultra", 1300000),
new Phone("아이폰14pro-max", 1800000),
new Phone("아이폰13plus", 1100000),
new Phone("갤럭시x플립4", 1350000)
};
Arrays.sort(list);
}
}
ClassCastException : 부모 클래스 객체를 자식 객체로 형변환하려고 할 때 뜨는 오류
객체를 정렬하려면 -> 객체끼리 먼저 비교 -> 하지만 비교의 기준은?
java.lang 소속 (= 사용 빈도 높음 = 매우 중요함!!!)
a.compareTo(b)
a > b : 양수
a < b : 음수
a == b : 0
return (price - other.getPrice()) * -1;
return model.compareTo(other.getModel()) * -1;
Natural ordering of Java objects is ordering
based on interface implementation (i.e. method ).ComparablecompareTo
- generics : 1.5~
타입을 미리 정하지 않고 동적으로 객체 생성시에 결정
1.7부터 생략 가능
한계: 클래스 정의할 때 T 멤버변수, T 패러미터를 활용할 수 없음 (무엇이 올지 알 수 없으니까)
그러니까 사용하려고 하지 말고 그냥 이해만 하자.
interface에서 사용할 경우 implements 될 때(override할 때) 결정된다.- generics이 생긴 이유
원래는 Object로 받음 -> 뭐든 넣을 수 있으니까 넣고 확인하고 형변환해야함 (+a 이유 있음 나중에 설명)
class Some<T> {
public T member;
public Some(T member) {
this.member = member;
}
}
interface ITodo<T> {
void printSome(T t);
}
class Other implements ITodo<String> {
public void printSome(String t){
}
}
class SortEx3 {
public static void main(String[] args) {
Some<String> s1 = new Some<String>("abc");
Some<Phone> s2 = new Some<Phone>(new Phone("갤럭시2", 50000));
}
}
/*
======================
Human
======================
- name : String
- age : int
- weight : double
======================
+ Human(name : String, age : int, weight : double)
+ getters / setters
+ toString() : String
1. 나이로 오름차순 정렬, 나이가 같으면 모무게로 내림차순
2. 이름으로 내림차순 정렬, 이름이 같으면 나이로 내림차순
3. 몸무게로 오름차순 정렬, 몸무게가 같으면 나이로 오름차순
*/
import java.util.Arrays;
class Human implements Comparable<Human> {
private String name;
private int age;
private double weight;
public Human(String name, int age, double weight) {
setName(name);
setAge(age);
setWeight(weight);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getWeight() {
return weight;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setWeight(double weight) {
this.weight = weight;
}
@Override
public String toString() {
return name + "(" + age + ") " + weight + "kg";
}
@Override
public int compareTo(Human other) {
/* (1)
int result = age - other.getAge();
if(result == 0) {
result = (int) (weight - other.getWeight()) * -1;
}
return result;
*/
/* (2)
int result = name.compareTo(other.getName()) * -1;
if(result == 0) {
result = (age - other.getAge()) * -1;
}
return result;
*/
// (3)
int result = (int) (weight - other.getWeight());
if(result == 0) {
result = (age - other.getAge());
}
return result;
}
}
class SortEx4 {
public static void main(String[] args) {
Human h1 = new Human("김갑을", 40, 65);
Human h2 = new Human("김갑수", 45, 70);
Human h3 = new Human("김갑을", 45, 65);
Human[] list = new Human[] {h1, h2, h3};
Arrays.sort(list);
System.out.println(Arrays.toString(list));
}
}
interface comparable<T>
의 한계 :Comparable과 Comparator
- 주 비교 기준인 comparable - 직접비교 (객체 간 직접 비교)
- 부 비교 기준인 comparator - 간접비교 (제3의 객체를 만들어 비교)
- 둘은 별개의 기능 수행, 경우에 따라 선택해서 사용
T o1
이 비교 기준 (<-> compareTo(T o)
: this object가 기준)T[] a
를 Comparator <? super T> c
에 따라 정렬함generic이 java api 문서에서 나타나는 형태 2가지
? super T
: T의 상위 타입(T 포함) - 하향제한? extends T
: T의 하위 타입(T 포함) - 상향제한?
: Object (모든 객체)
- 어떻게 쓰여있든 대부분은 그냥 T를 의미함
double값을 int로 출력할 때는 반올림에 주의
public int compare(Object o1, Object o2) { return o1.weight - o2.weight; // 자동 반올림될 때 -0.5 < x < 0.5 구간이 0으로 처리되어 오류가 날 수 있음 // 확실하게 하기 위해 if문으로 정리 }