티스토리 뷰
primitive 타입 데이터의 정렬
- Arrays 클래스가 primitive 타입 데이터를 위한 정렬 메소드를 제공
- int(정수형) 이외의 다른 primitive 타입(double, char 등)에 대해서도 제공
int[] data = new int[capacity];
//data[0]에서 data[capacity-1]까지 데이터가 꽉 차있는 경우에는 다음과 같이 정렬
Arrays.sort(data);
//배열이 꽉 차있지 않고 size개의 데이터만 있다면 다음과 같이 정렬
Arrays.sort(data, 0, size); //0은 시작 인덱스, size는 데이터의 갯수
객체의 정렬 : 문자열
String[] fruits = new String[]{"pineapple", "apple", "orange", "banana"};
Arrays.sort(fruits); //String 타입 배열이므로 사전식 순서대로 정렬
for(String name : fruits)
System.out.println(name);
ArrayList의 정렬 : 문자열
List<String> fruits = new ArrayList<>(); //배열이 아닌 collection class로 저장
fruits.add("pineapple");
fruits.add("apple");
fruits.add("orange");
fruits.add("banana");
Collections.sort(fruits); //Collections.sort()가 Arrays.sort()와 똑같은 기능 제공
fruits.forEach(System.out::println);
객체의 정렬 : 사용자 정의 객체
- 객체들간의 크기 관계가 정의되어있지 않은 기본 클래스
public class Fruit {
private String name;
private int quantity;
public Fruit(String name, int quantity) {
this.name = name;
this.quantity = quantity;
}
}
Comparable Interface
- 사용자 정의 객체의 크기를 비교해야할 때 사용하는 인터페이스
- 크기 비교 규칙을 구현하는 compareTo 메소드를 요구
- 이름을 기준으로 크기 결정
public class Fruit implements Comparable<Fruit> { //Comparable 인터페이스 implement
public String name;
public int quantity;
public Fruit(String name, int quantity) {
this.name = name;
this.quantity = quantity;
}
//이름을 기준으로 크기 결정
@Override
public int compareTo(Fruit other) { //크기를 비교하는 규칙을 구현
return name.compareTo(other.name);
}
}
- 재고를 기준으로 크기 결정
public class Fruit implements Comparable<Fruit> { //Comparable 인터페이스 implement
public String name;
public int quantity;
public Fruit(String name, int quantity) {
this.name = name;
this.quantity = quantity;
}
//재고의 양으로 크기 결정
@Override
public int compareTo(Fruit other) {
return quantity - other.quantity
}
}
Comparator Interface
- 하나의 객체 타입에 대해서 2가지 이상의 기준으로 정렬할 때 사용하는 인터페이스
- compare 메소드를 요구하는 메소드
- comparator interface를 상속받아 compare 메소드를 구현하는 익명 클래스를 생성한 후 그 클래스의 객체를 생성하여 정렬
//comparator interface를 상속받는 익명 클래스를 생성한 후 그 클래스의 객체인 nameComparator 생성
Comparator<Fruit> nameComparator = new Comparator<Fruit>() {
public int compare(Fruit fruit1, Fruit fruit2) { //두개의 사용자 정의 객체를 받아 크기를 비교하는 메소드
return fruit1.name.compareTo(fruit2.name); //이름을 기준으로 크기 비교
}
}
//comparator interface를 상속받는 익명 클래스를 생성한 후 그 클래스의 객체인 quantityComparator 생성
Comparator<Fruit> quantityComparator = new Comparator<Fruit>() {
public int compare(Fruit fruit1, Fruit fruit2) {
return fruit1.quantity - fruit2.quantity; //재고를 기준으로 크기 비교
}
}
//nameComparator와 quantityComparator는 Comparator Interface를 구현하는 어떤 클래스의 객체
Arrays.sort(fruits, nameComparator); //nameComparator의 compare 메소드를 이용해 크기 비교
또는
Arrays.sort(fruits, quantityComparator); //quantityComparator의 compare 메소드를 이용해 크기 비교
- dataClass 안에 static memeber로 구현
- 모든 Fruit 객체들이 두개의 Comparator 객체를 공통적으로 가짐
public class Fruit {
private String name;
private 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> quantityComparator = new Comparator<Fruit>() {
public int compare(Fruit fruit1, Fruit fruit2) {
return fruit1.quantity - fruit2.quantity;
}
}
}