인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.
Sorting in Java
Arrays 클래스가 primitive 타입 데이터를 위한 정렬 메서드를 제공
int[] data = new int[capacity];
//data[0]에서 data[capacity-1]까지 데이터가 꽉차 있는 경우에는 다음과 같이 정렬한다.
Arrays.sort(data);
//배열이 꽉차 있지 않고 data[0]에서 data[size-1]까지 size개의 데이터만 있다면 다음과 같이 한다.
Arrays.sort(data, 0, size);
int 이외의 다른 primitive 타입 데이터(double, char 등)에 대해서도 제공
String[] fruits = new String[] {"Pineapple", "Apple", "Orange", "Banana"};
Arrays.sort(fruits);
for(String name : fruits)
System.out.println(name);
List<String fruits = new ArrayList<String>();
fits.add("Pineapple");
fits.add("Apple");
fits.add("Orange");
fits.add("Banana");
Collections.sort(fruits);
for(String name : fruits)
System.out.println(name);
사용자 정의 객체
public class Fruit{
public String name;
public int quantity;
public Fruit(String name, int quantity){
this.name = name;
this.quantity = quantity;
}
}
// somewhere in your program
Fruit [] fruits = new Fruit[4];
fruits[0] = new Fruit("Pineapple",70);
fruits[0] = new Fruit("Apple",100);
fruits[0] = new Fruit("Orange",80);
fruits[0] = new Fruit("Banana",90);
Arrays.sort(fruits);
무엇이 더 큰지 알수 없다.
사과와 바나나 중 누가 더큰가?
Comparable 인터페이스를 이용 하여 해결
public class Fruit implements Comparable<Fruit>{
public String name;
public int quantity;
public Fruit(String name, int quantity){
this.name = name;
this.quantity = quantity;
}
//이름을 기중으로 정렬
public int compareTo(Fruit other){
return name.compareTo(other.name);
}
//수량을 기준으로 정렬
public int compareTo(Fruit other){
return quantity - other.quantity;
}
}
두가지 기준으로 정렬을 하고 싶다면?
하나의 객체 타입에 대해서 2가지 이상의 기준으로 정렬을 지원 할려면?
Comparator 인터페이스를 사용
Comparator 클래스를 extends하여 compare 매서드를 overriding하는 새로운 이름 없는 클래스를 정의한 후 그 클래스의 객체를 하나 생성한다.
//Comparator를 implements하는 익명의 클래스로 객체를 만든다
Comparator<Fruit> nameComparator = new Comparator<Fruit>(){
public int compare(Fruit fruit1, Fruit fruit2){
return fruit1.name.compareTo(fruit2.name);
}
};
Comparator<Fruit> quantComparator = new Comparator<Fruit>(){
public int compare(Fruit fruit1, Fruit fruit2){
return fruit1.quantity - fruit2.quantity;
}
};
Arrays.sort(fruits, nameComparator);
//or
Arrays.sort(fruits, quantComparator);
public class Fruit{
public String name;
public int quantity;
public Fruit(String name, int quantity){
this.name = name;
this.quantity = quantity;
}
public static Comparator<Fruit> nameComparator = new Comparator<Fruit>(){
public int compare(Fruit fruit1, Fruit fruit2){
return fruit1.name.compareTo(fruit2.name);
}
};
public static Comparator<Fruit> quantComparator = new Comparator<Fruit>(){
public int compare(Fruit fruit1, Fruit fruit2){
return fruit1.quantity - fruit2.quantity;
}
};
}
각각의 객체마다 Comparator를 따로 갖고 있을 필요가 없기 때문에 static으로 둔다.