기본 데이터 타입의 정렬
기본 데이터 타입 : char, int, double 등
Arrays 클래스에서 primitive 데이터 타입을 위한 정렬 메소드를 제공한다.
import java.util.Arrays;
int[] nums = { 1, 3, 5, 2, 4 };
System.out.println(Arrays.toString(nums)); // 출력 : [1, 3, 5, 2, 4]
// 오름차순으로 정렬
Arrays.sort(nums);
System.out.println(Arrays.toString(nums)); // 출력 : [1, 2, 3, 4, 5]
객체의 정렬
객체 타입 : String, Character, Integer, Double 등
기본형을 객체로 다루기 위해 사용하는 클래스를 wrapper class라 하는데 Integer는 int의 wrapper class이다.
Arrays 클래스에서 객체 타입을 위한 정렬 메소드를 제공한다.
import java.util.Arrays;
String[] arr = { "banana", "orange", "apple", "melon" };
System.out.println(Arrays.toString(arr)); // 출력 : [banana, orange, apple, melon]
// 오름차순으로 정렬
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // 출력 : [apple, banana, melon, orange]
import java.util.Arrays;
Integer[] nums = { 1, 3, 5, 2, 4 };
System.out.println(Arrays.toString(nums)); // 출력 : [1, 3, 5, 2, 4]
// 오름차순으로 정렬
Arrays.sort(nums);
System.out.println(Arrays.toString(nums)); // 출력 : [1, 2, 3, 4, 5]
import java.util.Comparator;
// 내림차순으로 정렬
Arrays.sort(nums, Comparator.reverseOrder());
System.out.println(Arrays.toString(nums)); // 출력 : [5, 4, 3, 2, 1]
ArrayList의 정렬
위의 것들과 다르게 Collections 클래스에서 기능을 제공한다.
import java.util.Collections;
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(5);
list.add(4);
list.add(1);
list.add(3);
for (Integer element : list) {
System.out.print(element + " "); // 출력 : 2 5 4 1 3
}
System.out.println();
// 오름차순으로 정렬
Collections.sort(list);
for (Integer element : list) {
System.out.print(element + " "); // 출력 : 1 2 3 4 5
}
System.out.println();
사용자 정의 객체의 정렬
정렬의 대상이 될 데이터에 대해 객체간의 크기 비교를 정의해야 한다.
Comparable 인터페이스를 implements하고, compareTo 메소드를 override한다.
class Item implements Comparable<Item> {
int value1;
int value2;
public Item(int value1, int value2) {
this.value1 = value1;
this.value2 = value2;
}
@Override
public String toString() {
return "{" + value1 +
", " + value2 +
'}';
}
@Override
public int compareTo(Item item) {
// value1를 중심으로 오름차순으로 정렬
int comp = this.value1 - item.value1;
if (comp == 0) {
// value1가 같다면 value2를 중심으로 오름차순으로 정렬
return this.value2 - item.value2;
}
return comp;
}
}
import java.util.Arrays;
import java.util.Comparator;
Item[] items = new Item[5];
items[0] = new Item(3, 5);
items[1] = new Item(1, 4);
items[2] = new Item(4, 2);
items[3] = new Item(2, 3);
items[4] = new Item(3, 2);
System.out.println(Arrays.toString(items)); // 출력 : [{3, 5}, {1, 4}, {4, 2}, {2, 3}, {3, 2}]
// Item 클래스에서 정의한대로 정렬
Arrays.sort(items);
System.out.println(Arrays.toString(items)); // 출력 : [{1, 4}, {2, 3}, {3, 2}, {3, 5}, {4, 2}]
// 직접 정렬 방법을 정의하여 정렬
Arrays.sort(items, new Comparator<Item>() {
@Override
public int compare(Item item1, Item item2) {
int comp = item2.value1 - item1.value1;
if (comp == 0) {
return item2.value2 - item1.value2;
}
return comp;
}
});
System.out.println(Arrays.toString(items)); // 출력 : [{4, 2}, {3, 5}, {3, 2}, {2, 3}, {1, 4}]
Comparable vs Comparator
자바에서는 주어진 객체를 비교하여 정렬할 수 있도록 두 인터페이스를 제공한다.
수많은 데이터 중 어떤 데이터를 기준으로 정렬할지 정하기 위해 이를 사용한다.
특성 | Comparable | Comparator |
메소드 | compareTo(Object o) |
compare(Object o1, Object o2) |
비교 방법 | 객체가 한 개 제공되어 자기 자신과 비교 |
객체가 두 개 제공되어 서로 비교 |
패키지 | java.lang 패키지 (import 해 줄 필요 X) |
java.util 패키지 (import 해 줘야 함) |
Return value | 음수 : 두 데이터를 바꾸지 않음 0 : 두 데이터가 동일함 양수 : 두 데이터를 바꿈 |
728x90
반응형
'알고리즘 > 정렬' 카테고리의 다른 글
[CS] 정렬 알고리즘 (JAVA) (0) | 2023.04.04 |
---|---|
[백준] 1920번 수 찾기 (JAVA) (0) | 2023.02.19 |
[백준] 1713번 후보 추천하기 (JAVA) (0) | 2023.02.19 |
[백준] 1339번 단어 수학 (JAVA) (0) | 2023.02.19 |