알고리즘 문제를 풀다보면 배열이나 리스트를 정렬해야할 때가 있습니다.
그래서 배열의 정렬에 대해 정리를 해보았습니다.
1. 기본 오름차순 정렬
Arrays.sort() 함수로 기본 오름차순 정렬을 합니다.
Integer arr[] = {1,2,5,3,10,12,11};
Arrays.sort(arr); //오름차순 정렬
System.out.println(Arrays.toString(arr));
2. 부분 정렬
Arrays.sort 함수에 파라미터를 주어서 정렬합니다.
Integer arr[] = {1,2,5,3,10,12,11};
Arrays.sort(arr,4,6);//배열의 4~6번째 인덱스만 오름차순으로 정렬
System.out.println(Arrays.toString(arr));
3. 내림차순 정렬
Collections.reverseOrder() 함수를 이용해 정렬합니다.
그런데 Collections.reverseOrder 함수는 primitive type에는 지원하지 않아 int 대신 Integer형으로 배열을 생성했습니다.
Integer arr[] = {1,2,5,3,10,12,11}; //int는 Collections.reverOrder를 지원하지 않음
Arrays.sort(arr, Collections.reverseOrder()); //배열을 내림차순으로 정렬
System.out.println(Arrays.toString(arr));
4. 객체 정렬
선수라는 객체가 이름과 점수를 가지고 있을 때 점수를 기준으로 정렬을 해야한다면 어떻게 해야할까요?
이때는 Java에서 제공하는 Comparable과 Comparator 인터페이스를 이용하여 할 수 있습니다.
우선 Comparable을 사용하여 정렬하는 법을 코드로 보겠습니다.
class Player implements Comparable<Player>{
private int score;
private String name;
public Player(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public int compareTo(Player o) {
return this.score - o.score;
//내림차순 정렬은 return o.score - this.score;
}
public String getName() {
return this.name;
}
public int getScore() {
return this.score;
}
}
Comparable은 선수라는 클래스에 score라는 점수라는 변수를 기준으로 정렬을 할 수 있게 해줍니다. 즉 하나의 변수에 의해서만 정렬이 가능하죠. Player라는 클래스를 만들 때 Comparable을 상속받고 compareTo 함수를 오버라이드 해주시면 됩니다.
다음은 Comparator의 코드입니다.
class PlayerSorting implements Comparator<Player>{
@Override
public int compare(Player o1, Player o2) {
//내림차순 o2.getScore() - o1.getScore();
return o1.getScore() - o2.getScore();
}
}
Comparator는 클래스 자체로 정렬 규칙입니다. 하나이상의 변수를 가지고 정렬을 할 수 있는 규칙을 만드는게 가능합니다.
아래는 정렬 관련된 코드의 전체입니다.
도움이 되셨길 바랍니다.
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
public class Sorting {
public static void main(String[] args) {
Integer arr[] = {1,2,5,3,10,12,11}; //int는 Collections.reverOrder를 지원하지 않음
Arrays.sort(arr); //오름차순 정렬
System.out.println(Arrays.toString(arr));
Arrays.sort(arr,4,6);//배열의 부분만 오름차순으로 정렬
System.out.println(Arrays.toString(arr));
Arrays.sort(arr, Collections.reverseOrder()); //배열을 내림차순으로 정렬
System.out.println(Arrays.toString(arr));
//객체 정렬(score를 기준으로 정렬)
Player playerArr[] = {new Player("John", 53), new Player("Thomas", 100),new Player("Paul", 21) };
Arrays.sort(playerArr);
for(Player p : playerArr){
System.out.print(p.getName() + " " + p.getScore()+ ", ");
}
Arrays.sort(playerArr, new PlayerSorting());
for(Player p : playerArr){
System.out.print(p.getName() + " " + p.getScore()+ ", ");
}
}
}
class Player implements Comparable<Player>{
private int score;
private String name;
public Player(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public int compareTo(Player o) {
//내림차순 정렬은 return o.score - this.score;로 변경해주면 됌
return this.score - o.score;
}
public String getName() {
return this.name;
}
public int getScore() {
return this.score;
}
}
class PlayerSorting implements Comparator<Player>{
@Override
public int compare(Player o1, Player o2) {
//내림차순 o2.getScore() - o1.getScore();
return o1.getScore() - o2.getScore();
}
}
'개발 > Java' 카테고리의 다른 글
Import vs Import static (0) | 2021.06.17 |
---|---|
Shallow copy와 Deep copy (0) | 2021.03.25 |
암호화란? (ECB 샘플 코드) (0) | 2021.03.16 |
Scanner vs BufferedReader 비교 (0) | 2021.02.10 |
로컬 java 프로세스를 jconsole로 모니터링 (0) | 2020.06.23 |