Java 에서의 정렬

Reading time ~1 minute

인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.

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으로 둔다.