[알고리즘] [JAVA] Arrays.sort와 Collections.sort

업데이트:



오늘은 코딩테스트 문제풀이중 계속 헷갈리고 어려운 정렬에 대해서 쭉 정리해보려고 한다. Arrays.sort, Collections.sort 그리고 오름차순, 내림차순, 마지막으로 Comparator를 사용한 compare 재정의 까지 알아보도록 하겠다.

✅ Arrays.sort

Arrays.sort는 배열을 정렬해주는 기능을 합니다. 배열에 Integer가 있든, String이 있든 상관없이 정렬이 가능합니다.

기본적으로 객체는 Comparable이 구현되어있습니다. sort()Comparable에 의해 리턴되는 값을 비교하여 오름차순 또는 내림차순으로 배열을 정렬합니다.

대부분의 경우의수를 구현해보면서 사용법을 알아보도록 하겠습니다.

  • int 배열 오름차순, 내림차순 정렬
  • String 배열 오름차순, 내림차순 정렬
  • String 배열 문자 길이 순서대로 정렬
  • 객체 배열 정렬






📌 int 배열 (오름차순)

기본적으로 Arrays.sort는 오름차순을 기본값으로 합니다.

int[] arr = {1,20,254,13,76,22};

Arrays.sort(arr);

System.out.println(Arrays.toString(arr));


Output :

[1, 13, 20, 22, 76, 254]






📌 int 배열 (내림차순)

내림차순으로 정렬하기 위해서는 sort()인자에 Collections.reverseOrder()를 추가하면 됩니다.

Integer[] arr = {1, 26, 17, 25, 99, 44, 303};

Arrays.sort(arr, Collections.reverseOrder());

System.out.println("Sorted arr[] : " + Arrays.toString(arr));

Output :

[303, 99, 44, 26, 25, 17, 1]



Collections.reverseOrder()는 Comparator 객체입니다. 일반적으로 Comparator는 직접 구현해서 사용하지만 내림차순 같은 경우는 많이 사용되므로 Collections에서 기본으로 제공해주고 있습니다.

이를 직접 구현하면 아래와 같습니다.

Integer[] arr = {1, 26, 17, 25, 99, 44, 303};

Arrays.sort(arr, Comparator<Integer>(){
	@Override
	public int compare(Integer i1, Integer i2){
		return i2-i1;
	}
});

System.out.println(Arrays.toString(arr));






📌 String 배열 (오름차순 & 내림차순)

String배열도 int배열과 별반 다르지 않습니다.

String[] arr = { Apple, Banana, Pineapple, Cherry, Orange }

Arrays.sort(arr)

System.out.println(Arrays.toString(arr));

Output :

[ Apple, Banana, Cherry, Orange, Pineapple ]


내림차순 역시 동일합니다.

String[] arr = { Apple, Banana, Pineapple, Cherry, Orange }

Arrays.sort(arr,Collections.reverseOrder());

System.out.println(Arrays.toString(arr));

Output :

[ Pineapple, Orange, Cherry, Banana, Apple ]






📌 String 배열, 문자열 길이 순서대로 정렬

String배열의 문자열 길이 순서대로 정렬하고 싶다면 Comparator를 구현해야 합니다.

String[] arr = { Apple, Banana, Pineapple, Cherry, Orange }

Arrays.sort(arr, new Comparator<String>(){
	@Override
	public int compare(String s1, String s2){
		return s1.length()-s2.length();
	}
});

System.out.println(Arrays.toString(arr));

Output :

[ Apple, Orange, Cherry, Banana, Pineapple ]






📌 객체 정렬 - Comparable 인터페이스

객체 정렬 방법은 여러가지가 있습니다. 그중 흔하게 쓰이는 Comparable을 사용한 객체 정렬부터 알아보도록 하겠습니다.

먼저 사람이름과 점수를 갖고 있는 객체를 하나 생성해보고 이를 정렬해보도록 하겠습니다.

public class Player {
    private String name;
    private int score;

    public Player(String name, int score) {
        this.name = name;
        this.score = score;
    }
}

그리고 5명의 사람이 갖고 있는 점수를 생성해서 리스트에 담아보도록 하겠습니다.

List<Player> players = new ArrayList<>();
players.add(new Player("Alice", 80));
players.add(new Player("Bob", 90));
players.add(new Player("Chloe", 100));
players.add(new Player("Dale", 70));
players.add(new Player("Eric", 50));

이제 다섯명의 사람을 점수별로 오름차순,내림차순 정렬해보겠습니다. Comparable 을 사용해서 정렬하면 다음과 같습니다.

public class Player implements Comparable<Player> {
    private String name;
    private int score;

    public Player(String name, int score) {
        this.name = name;
        this.score = score;
    }

	// 오름차순 정렬
	@Override
	public int compareTo(Player p1){
		return this.score - p1.score;
	}
	
	// 내림차순 정렬
	@Override
	public int compareTo(Player p1){
		return p1.score - this.score;
	}
}
Collections.sort(players);






📌 객체 정렬 - Comparator 인터페이스 사용

정렬대상 클래스의 코드를 직접 수정할 수 없는 경우, 혹은 정렬하고자 하는 객체에 이미 존재하는 정렬기준과 다른 정렬 기주으로 정렬하고 싶은 경우 Comparator 인터페이스를 사용해 정렬할 수 있습니다.

Comparator 인터페이스 구현체를 Arrays.sort()Collections.sort() 같은 정렬 메서드의 추가 인자로 넘기면 새로운 기준으로 객체를 정렬할 수 있습니다.

Comparator<Player> comparator = new Comparator<Player>(){

	// 점수기준 오름차순
	@Override
	public int compare(Player a, Player b){
		return a.score - b.score;
	}

	// 점수 기준 내림차순
	@Override
	public int compare(Player a, Player b){
		return b.score - a.score;
	}






📌 Compare 과 CompareTo

댓글남기기