상황
- 여러가지 수를 받고 정렬해야하는 경우가 자주 생기게 됩니다.
- 수를 정렬하는 방법은 매우 다양하게 존재합니다. (계수 정렬, 선택 정렬, 버블 정렬, 힙 정렬, 퀵 정렬 등)
- 상황에 맞게 정렬을 선택하여 최선의 방식으로 시간복잡도를 줄이는 것이 매우 중요하지만 정렬을 상황에 맞게 사용한다는 것은 매우 어려운 일입니다.
- 그래서 JAVA에서 지원하는 명령어 Arrays.sort와 Collections.sort를 알아보도록 하겠습니다.
사용법
import java.io.*;
import java.util.*;
public class Test{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//BufferedReader를 통해 입력 값 받기
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//BufferedWriter를 통해 결과 출력
int[] arr = {3,2,5,7,1,9,10}; //배열 값 저장
Arrays.sort(arr); //Arrays.sort 오름차순 정렬
bw.write("Arrays.sort 결과\n");
for(int i=0;i<arr.length;i++)
bw.write(arr[i] + "\n"); //Arrays.sort결과 BufferedWriter에 저장
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(3,2,5,7,1,9,10));
Collections.sort(list); //Collections.sort 오름차순 정렬
bw.write("Collections.sort 결과\n");
for(int i=0;i<list.size();i++)
bw.write(list.get(i) + "\n"); //Collections.sort결과 BufferedWriter에 저장
bw.flush(); //결과 출력
bw.close();
br.close();
}
}
우선 Arrays.sort, Collections.sort는 java.util에 포함되어 있기 때문에 import java.util.*를 선언해주어야 합니다.
Arrays.sort
- Arrays.sort는 배열에 형태에서만 적용이 가능합니다.
- 기본적으로 오름차순으로만 정렬이 가능합니다.
- 내림차순으로 정렬하려면 Arrays.sort(arr,Collections.reverseOrder())로 작성해야 하지만 조건이 있습니다.
- 조건은 Collections.reverseOrder를 사용하려면 객체 타입으로 선언되어야 합니다. int형은 primitive type(원시 자료형)으로 내림차순으로 정렬되지 않습니다. 그래서 int형으로 배열을 선언하는 것이 아닌 Integer형으로 배열을 선언한다면 내림차순 정렬도 가능하게 됩니다.
- 위에 코드에서는 Integer[] arr = {3,2,5,7,1,9,10}으로 선언하면 내림차순 정렬도 가능하다.
Collections.sort
- 객체 자료형에 List형식을 정렬하는 명령어입니다.
- 기본적으로 오름차순으로 정렬이 가능합니다.
- 내림차순으로 정렬하려면 Collections.sort(list,Collections.reverseOrder())를 사용하면 됩니다.
- Comparator를 사용하여 상황에 맞게 정렬을 진행할 수 있습니다.
import java.io.*;
import java.util.*;
public class Test{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//BufferedReader를 통해 입력 값 받기
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//BufferedWriter를 통해 결과 출력
ArrayList<String> list = new ArrayList<>();
list.add("Winter is Coming");
list.add("Hello World");
list.add("My name is Java");
list.add("Show Me The Money");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
});
bw.write("Collections.sort 결과\n");
for(int i=0;i<list.size();i++)
bw.write(list.get(i) + "\n");
bw.flush(); //결과 출력
bw.close();
br.close();
}
}
- String형태에 ArrayList에서 글자 길이에 따라 정렬하도록 Comparator를 만든 형태입니다.
- 이 뿐만 아니라 객체를 통해서 정렬을 진행할 수 있습니다.
import java.io.*;
import java.util.*;
class person implements Comparable<person>{ //사람 객체
String name;
int age;
public person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(person person) { //Comparator
return person.age-this.age; //나이 많은 순
}
}
public class Test{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//BufferedReader를 통해 입력 값 받기
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//BufferedWriter를 통해 결과 출력
ArrayList<person> list = new ArrayList<person>();
list.add(new person("Hong",26)); //값 저장
list.add(new person("Gil",33));
list.add(new person("Dong",42));
Collections.sort(list); //정렬
bw.write("Collections.sort 결과\n");
for(int i=0;i<list.size();i++)
bw.write(list.get(i).getName() + " " + list.get(i).getAge() + "\n");
bw.flush(); //결과 출력
bw.close();
br.close();
}
}
- 위 코드처럼 List가 객체 형식으로 만들어졌으면 따로 비교하는 Comparator를 만들어서 정렬을 진행할 수 있습니다.
- 객체에서 Compartor를 형성하기 위해 implements Comparable<객체명>을 선언해주어야 합니다.
- 비교하게 되는 compareTo를 형성하여 어떻게 정렬할 것인지 정의해야 합니다.
결과
위에 예제로 쓰였던 코드들의 결과를 보여드리도록 하겠습니다.
Arrays.sort와 Collections.sort를 오름차순으로 코드의 결과
Collections.sort에서 Comparator를 통해 String형의 List를 정렬한 결과
(String길이 작은 것부터)
Collections.sort에서 person에 객체에 따로 Comparator를 형성하여 정렬한 결과
(나이가 높은 순으로)
'JAVA' 카테고리의 다른 글
[JAVA] Character형 숫자, 알파벳인지 확인하기 Character.isDigit/Character.isAlphabetic (0) | 2023.02.19 |
---|---|
[JAVA] 이항계수 알고리즘 정리 (0) | 2022.02.07 |
[JAVA] 숫자 큰값/작은값 비교하기 Math.max/Math.min (0) | 2022.01.04 |
[JAVA] 숫자 제곱근(루트) 구하는 방법 Math.sqrt() (0) | 2022.01.02 |
[JAVA] 큰 정수(숫자) 다루는 방법 BigInteger (0) | 2021.12.31 |
댓글