티스토리 뷰

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;
    }
  }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함