간단한 정렬 Sort
1. Arrays 클래스의 정렬
- java.util.Arrays 클래스는 배열을 정렬하는 데 사용됩니다.
- 기본적으로 오름차순으로 정렬하며, 사용자 정의 기준으로 정렬하려면 Comparator를 사용합니다.
- 문자열의 경우 아스키코드 순 (알파벳 순)으로 오름차순 정렬되며, 한글도 가나다 순으로 정렬됩니다.
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] numbers = {5, 2, 8, 3, 1};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers)); // [1, 2, 3, 5, 8]
String[] names = {"Charlie", "Alice", "Bob"};
Arrays.sort(names);
System.out.println(Arrays.toString(names)); // [Alice, Bob, Charlie]
// 사용자 정의 기준 정렬
Arrays.sort(names, (a, b) -> b.compareTo(a)); // 내림차순
System.out.println(Arrays.toString(names)); // [Charlie, Bob, Alice]
}
}
2. Collections 클래스의 정렬
- java.util.Collections 클래스는 리스트를 정렬할 때 사용됩니다.
- Collections.sort()는 Comparable 인터페이스를 구현한 클래스의 자연 정렬 기준을 따르며, 필요하면 Comparator로 미리 설정된 정렬 기준을 제공합니다. (오름차순 외의 내림차순과 같은)
- 인터페이스의 장점대로 다양한 정렬기준을 프로그래머가 직접 제시할 수 있습니다.
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 2, 8, 3, 1);
Collections.sort(numbers);
System.out.println(numbers); // [1, 2, 3, 5, 8]
// 내림차순 정렬
Collections.sort(numbers, Collections.reverseOrder());
System.out.println(numbers); // [8, 5, 3, 2, 1]
}
}
- 둘이 다르지만 사실, Collections.Sort() -> list.sort() 함수-> List.java.sort 메서드-> Array.sort(a Comparator) 함수
- 위와 같은 순서로 호출하다보니 결국 array, collections 배열 모드 실상은 array.sort로 돌아간다
- 즉 근본적으로 차이가 없다
+ 공식 Collections 클래스 문서
복잡한 정렬 Stream API
📌 Java 8 이상에서 도입된 Stream API는 컬렉션 또는 배열을 쉽게 정렬할 수 있는 기능을 제공합니다.
- sorted() 메서드는 기본적으로 자연 정렬을 따르며, 사용자 정의 기준도 제공합니다.
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList("Charlie", "Alice", "Bob");
// 오름차순 정렬
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNames); // [Alice, Bob, Charlie]
// 내림차순 정렬
List<String> reversedNames = names.stream()
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());
System.out.println(reversedNames); // [Charlie, Bob, Alice]
}
}
복잡한 정렬 Comparator와 Comparable
📌 Java에서 객체를 정렬하기 위해 사용하는 두 가지 인터페이스입니다.
1. Comparable
- 정의: 객체 자체가 "자연 정렬 순서"를 정의하도록 설계된 인터페이스.
- 메서드: compareTo(T o) 메서드를 구현해야 합니다.
- 사용 방법:
- 클래스가 직접 Comparable을 구현하고, 정렬 로직을 내부에서 정의합니다.
- 정렬 기준이 고정적이며, 클래스 설계 시 미리 정의되어야 합니다.
import java.util.*;
class Student implements Comparable<Student> {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Student other) {
return Integer.compare(this.age, other.age); // 나이를 기준으로 오름차순 정렬
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
public class Main {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("Alice", 23),
new Student("Bob", 21),
new Student("Charlie", 22)
);
Collections.sort(students); // Comparable에 정의된 정렬 기준 사용
System.out.println(students); // [Bob (21), Charlie (22), Alice (23)]
}
}
2. Comparator
- 정의: 객체 외부에서 정렬 기준을 정의할 수 있는 인터페이스.
- 메서드: compare(T o1, T o2) 메서드를 구현해야 합니다.
- 사용 방법:
- 정렬 기준을 필요할 때마다 변경할 수 있도록 별도의 클래스를 작성하거나 람다식을 사용합니다.
- 동일한 클래스에 대해 여러 정렬 기준을 제공할 수 있습니다.
- 사용자 정렬 기준을 제기하면 보통 Comparator를 쓰게됩니다.
import java.util.*;
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
public class Main {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("Alice", 23),
new Student("Bob", 21),
new Student("Charlie", 22)
);
// 이름 기준으로 정렬
students.sort(Comparator.comparing(Student::getName));
System.out.println(students); // [Alice (23), Bob (21), Charlie (22)]
// 나이 기준으로 정렬
students.sort(Comparator.comparingInt(Student::getAge));
System.out.println(students); // [Bob (21), Charlie (22), Alice (23)]
}
}
- 이외에도 Guava와 같은 서드파티 라이브러리도 정렬 도구를 제공합니다.
- 우선순위 큐, 트리셋을 사용한 데이터를 추가하면서 정렬 상태를 유지하는 정렬도 존재합니다.
- Java의 기본 정렬은 Timsort를 기반으로 하며, 효율적이고 안정적입니다.
'Back-End (Web) > JAVA' 카테고리의 다른 글
[JAVA] 열거형 ( Enum ) (0) | 2024.11.22 |
---|---|
[JAVA] HASH란 무엇인가 (1) | 2024.11.21 |
[JAVA] 응용 정리 (1) | 2024.11.15 |
[JAVA] NULL (0) | 2024.11.13 |
[JAVA] 쓰레드 & 람다 함수 & 스트림 (3) | 2024.11.13 |