늦은 프로그래밍 이야기

[Java] ArrayList 정렬하기 본문

내일배움캠프/자료구조 알고리즘

[Java] ArrayList 정렬하기

한정규 2022. 12. 23. 01:12

Collections.sort()

public static void sort(List<T> list)
public static void sort(List<T> list, Comparator<? super T> c)

오름차순

Collections.sort(list);

ArrayList를 오름차순으로 정렬한다.

내림차순

Collections.sort(list, Collections.reverseOrder());

Collections.sort()의 2번째 파라미터로 내림차순 정렬을 나타내는 Comparator를 전달해서 ArrayList를 내림차순으로 정렬한다.

대소문자 구분없이 정렬

Collections.sort(list, String.CASE_INTENSITIVE_ORDER);

String.CASE_INTENSITIVE_ORDER를 전달하면, 대소문자 구분없이 오름차순으로 정렬된다.

Collections.sort(list, Collections.reverseOrder(String.CASE_INTENSITIVE_ORDER));

대소문자 구분 없이, 내림차순으로 정렬한다.


List.sort()

default void sort(Comparator <? super E> c)

오름차순

list.sort(Comparator.naturalOrder());

내림차순

list.sort(Comparator.reverseOrder());

대소문자 구분없이 정렬

오름차순

list.sort(String.CASE_INSENSITIVE_ORDER);

내림차순

list.sort(Comparator.reverseOrder(String.CASE_INSENSITIVE_ORDER));

 


사용자 정의

  • 사용자가 정의한 객체를 사용자가 원하는 방식으로 정렬하기 위해서 Comparable 인터페이스를 구현하여 객체의 정렬 방식을 지정할 수 있다.
  • Comparator 인터페이스를 구현하여 Custom Comparator를 직접 만들 수도 있다.

Comparable

  • Collections.sort() 메소드는 객체를 정렬할 때 해당 객체의 Comparable을 구현한 CompareTo() 메소드를 참조하여 정렬 순서를 결정한다.
  • 따라서, 정렬할 객체가 Comparable Interface를 구현하고, CompareTo() 메소드 안에 정렬 기준이 정의 된다면, Collections.sort() 메소드를 사용하여 객체를 정렬할 수 있다.
import java.util.ArrayList;
import java.util.Collections;

class Fruit implements Comparable<Fruit> {
    private String name;
    private int price;
 
    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }
 
    @Override
    public int compareTo(Fruit fruit) {
        if (fruit.price < price) {
            return 1;
        } else if (fruit.price > price) {
            return -1;
        }
        return 0;
    }
 
    @Override
    public String toString() {
        return "[ " + this.name + ": " + this.price + " ]";
    }
}
 
public class SortArrayList {
    public static void main(String[] args) {
 
        // ArrayList 준비
        ArrayList<Fruit> list = new ArrayList<>();
        list.add(new Fruit("Apple", 2000));
        list.add(new Fruit("Orange", 3000));
        list.add(new Fruit("Banana", 1000));
        System.out.println("원본 : " + list); // [[ Apple: 2000 ], [ Orange: 3000 ], [ Banana: 1000 ]]
 
        // price순 오름차순으로 정렬
        Collections.sort(list);
        System.out.println("오름차순 : " + list); // [[ Banana: 1000 ], [ Apple: 2000 ], [ Orange: 3000 ]]
 
        // price순 내림차순으로 정렬
        Collections.sort(list, Collections.reverseOrder());
        System.out.println("내림차순 : " + list); // [[ Orange: 3000 ], [ Apple: 2000 ], [ Banana: 1000 ]]
 
    }
}

Comparator

  • 사용자가 직접 Comparator Interface를 implements하여 Comparator를 만들 수 있다.
  • Comparator는 Collections.sort() 또는 List.sort() 메소드의 파라미터로 전달되어 정렬의 기준이 된다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Fruit {
    String name;
    int price;
 
    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }
 
    @Override
    public String toString() {
        return "[ " + this.name + ": " + this.price + " ]";
    }
}

class FruitPriceComparator implements Comparator<Fruit> {
    @Override
    public int compare(Fruit f1, Fruit f2) {
        if (f1.price > f2.price) {
            return 1;
        } else if (f1.price < f2.price) {
            return -1;
        }
        return 0;
    }
}
 
class FruitNameComparator implements Comparator<Fruit> {
    @Override
    public int compare(Fruit f1, Fruit f2) {
        return f1.name.compareTo(f2.name);
    }
}

public class SortArrayList {
    public static void main(String[] args) {
 
        // ArrayList 준비
        ArrayList<Fruit> list = new ArrayList<>();
        list.add(new Fruit("Apple", 2000));
        list.add(new Fruit("Orange", 3000));
        list.add(new Fruit("Banana", 1000));
        System.out.println("원본 : " + list); // [[ Apple: 2000 ], [ Orange: 3000 ], [ Banana: 1000 ]]
 
        // price순 오름차순으로 정렬
        Collections.sort(list, new FruitPriceComparator());
        System.out.println("price 순 오름차순 : " + list); // [[ Banana: 1000 ], [ Apple: 2000 ], [ Orange: 3000 ]]
 
        // price순 내림차순으로 정렬
        Collections.sort(list, new FruitPriceComparator().reversed());
        System.out.println("price 순 내림차순 : " + list); // [[ Orange: 3000 ], [ Apple: 2000 ], [ Banana: 1000 ]]
 
        // name순 오름차순으로 정렬
        Collections.sort(list, new FruitNameComparator());
        System.out.println("price 순 오름차순 : " + list); // [[ Apple: 2000 ], [ Banana: 1000 ], [ Orange: 3000 ]]
 
        // name순 내림차순으로 정렬
        Collections.sort(list, new FruitNameComparator().reversed());
        System.out.println("price 순 내림차순 : " + list); // [[ Orange: 3000 ], [ Banana: 1000 ], [ Apple: 2000 ]]
 
    }
}
  • 2개의 Comparator를 정의한다.
    • FruitPriceComparator - price 순으로 정렬
    • FruitNameComparator - name 순으로 정렬
  • 오름차순으로 정렬하기 위해서는 compare() 메소드의
    • 첫번째 파라미터 > 두번째 파라미터 이면 양수,
    • 첫번째 파라미터 < 두번째 파라미터 이면 음수,
    • 같으면 0을 리턴해야 한다.
  • FruitNameComparator의 경우 compare() 메소드 안에서 문자열을 비교하기 위해 사용된 compareTo() 메소드가 문자열의 크기 순서에 따라 양수, 0, 음수를 리턴하기 때문에 조건문 없이 compareTo()에서 리턴하는 값을 그대로 리턴한다.

출처 :

[Java] ArrayList 정렬하기 (오름차순, 내림차순, 사용자 정의)

 

[Java] ArrayList 정렬하기 (오름차순, 내림차순, 사용자 정의)

Collections.sort() 오름차순으로 정렬하기 내림차순으로 정렬하기 대소문자 구분없이 정렬하기 List.sort() - Java 8 이후 오름차순으로 정렬하기 내림차순으로 정렬하기 대소문자 구분없이 정렬하기 사

hianna.tistory.com

 

Comments