Java & Spring

[Java] 배열과 리스트를 정렬할 수 있는 방법 정리

ju_young 2023. 10. 9. 15:34
728x90

Arrays.sort()

  • 배열을 오름차순 정렬
import java.util.Arrays;

int[] array = {2, 6, 3, 1};
Arrays.sort(array);
// [1, 2, 3, 6]

 

Collections.sort()

  • 컬렉션(List, Set)을 오름차순 정렬
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(6);
list.add(2);

Collections.sort(list);
// [1, 2, 3, 6]

 

Comparable

TreeSet과 TreeMap은 정렬을 위해 java.lang.Comparable을 구현한 객체를 요구하는데, Integer, Double, String은 모두 Comparable 인터페이스를 구현하고 있다. 사용자 정의 클래스도 Comparable을 구현한다면 자동 정렬이 가능하다.

 

아래처럼 compareTo() 메소드를 오버라이딩하여 구현하면 된다.

메소드 설명
compareTo 주어진 객체와 같으면 0을 리턴
주어진 객체보다 적으면 음수를 리턴
주어진 객체보다 크면 양수를 리턴
public class Person implements Comparable<Person> {
    public String name;
    public int age;
    
    public Person(String name, int age) {
    	this.name = name;
        this.age = age;
    }
    
    /**
     * [오름차순 정렬]
     * 나이가 적을 경우 -1
     * 동일한 경우 0
     * 클 경우 1
    */
    @Override
    public int compareTo(Person o) {
    	if (age < o.age) return -1;
        else if (age == 0.age) return 0;
        else return 1;
    }
}

 

Comparator

Comparator 인터페이스는 다음과 같이 메소드가 정의되어 있다.

메소드 설명
compare o1과 o2가 동등하다면 0을 리턴
o1이 o2보다 앞에 오게 하려면 음수를 리턴
o1이 o2보다 뒤에 오게 하려면 양수를 리턴
import java.util.Comparator;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

// 클래스 정의
public class Fruit {
    public String name;
    public int price;

    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }
}

// 가격을 기준으로 내림차순 정렬하는 Comparator 생성
Comparator<Fruit> comparator = new Comparator<>() {
    @Override
    public int compare(Fruit o1, Fruit o2) {
        if (o1.price < o2.price) return 1; //내림차순이므로 o1이 뒤로 오도록 양수를 리턴 
        else if (o1.price == o2.price) return 0;
        else return -1; //내림차순이므로 o1이 앞에 오도록 음수를 리턴
    }
};

// 적용
List<Fruit> list = new ArrayList<>();
list.add(new Fruit("apple", 3000));
list.add(new Fruit("banana", 1000));
list.add(new Fruit("melon", 6000));
list.add(new Fruit("berry", 2000));

Collections.sort(list, comparator);
//["melon", "apple", "berry", "banana"]

Comparator.comparing

객체의 값을 지정할 수 있다면 comparing 메소드를 사용하여 다음처럼 간단하게 Comparator를 생성할 수 있다.

// 클래스 정의
public class Fruit {
    public String name;
    public int price;

    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }
    
    public int getPrice() {
        return price;
    }
}

// Comparator 생성
Comparator<Fruit> comparator = Comparator.comparing(Fruit::getPrice);

 

다중 정렬

두 가지 이상을 기준으로 정렬하고 싶다면  다음과 같이 thenComparing 메소드를 사용하면 된다.

// 클래스 정의
public class Fruit {
    public String name;
    public int price;

    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }
    
    public int getPrice() {
        return price;
    }
    
    public int getName() {
    	return name;
    }
}

// Comparator 생성
Comparator<Fruit> comparator = Comparator.comparing(Fruit::getPrice).thenComparing(Fruit::getName);

 

Stream.sorted

//배열
int[] array = {2, 1, 1, 2, 3, 1, 2, 3, 1};
int[] sortedArray = Arrays.stream(array).sorted().toArray(); //오름차순 정렬

//리스트
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(6);
list.add(2);

List<Integer> sortedList = list.stream().sorted().toList(); //오름차순 정렬
List<Integer> sortedList = list.stream().sorted(Comparator.naturalOrder()).toList(); //오름차순 정렬
List<Integer> sortedList = list.stream().sorted(Comparator.reverseOrder()).toList(); //내림차순 정렬
728x90

'Java & Spring' 카테고리의 다른 글

[Java] Set(집합)의 연산  (0) 2023.10.15
[Java] JVM과 Java의 실행 순서  (0) 2023.10.12
[Java] Stack 정리  (0) 2023.10.09
[Java] Queue와 PriorityQueue 정리  (0) 2023.10.09
[Java] String.format(%s, %d, %f, %t, %c)  (1) 2023.10.05