[알고리즘] [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;
}
댓글남기기