[Java] Stream.sorted(), 정렬하기
Java에서 Stream.sorted()
는 스트림의 요소들을 정렬하는데 사용하는 메소드입니다.
이 메소드를 사용하여 스트림의 요소들을 정렬할 수 있습니다.
Stream.sorted()로 스트림 정렬
아래 예제는 동일한 스트림에 대해서, 한번은 sorted()
를 사용하지 않고 요소들을 출력하고, 한번은 사용하고 출력합니다.
sorted()
를 호출함으로써, 스트림의 요소들이 오름차순으로 정렬되는 것을 볼 수 있습니다.
import java.util.stream.Stream;
public class Example {
public static void main(String[] args) {
Stream<Integer> numbers = Stream.of(3, 1, 4, 1, 5);
System.out.println("정렬되지 않은 스트림:");
numbers.forEach(System.out::println);
Stream<Integer> sortedNumbers = Stream.of(3, 1, 4, 1, 5).sorted();
System.out.println("\n오름차순으로 정렬된 스트림:");
sortedNumbers.forEach(System.out::println);
}
}
Output:
정렬되지 않은 스트림:
3
1
4
1
5
오름차순으로 정렬된 스트림:
1
1
3
4
5
예제 1. 내림차순으로 정렬
스트림에 인자 없이 sorted()
를 호출하면 객체에 정의된 Comparator를 사용하여 비교합니다. 일반적으로 오름차순으로 정렬되도록 구현되어있습니다.
만약 내림차순으로 정렬하고 싶다면, 정렬 규칙을 의미하는 Comparator를 직접 구현하여 sorted()
에 인자로 전달해야 합니다.
아래 예제는 내림차순으로 정렬합니다.
sorted((num1, num2) -> num2.compareTo(num1))
: 두개의 숫자를 내림차순으로 정렬되도록 비교
import java.util.stream.Stream;
public class Example {
public static void main(String[] args) {
Stream<Integer> numbers = Stream.of(3, 1, 4, 1, 5);
numbers.sorted((num1, num2) -> num2.compareTo(num1)).forEach(System.out::println);
}
}
Output:
5
4
3
1
1
예제 2. 문자열 스트림을 sorted()로 정렬
Integer 스트림뿐만 아니라 문자열 스트림도 sorted()
로 정렬할 수 있으며, 알파벳 순서대로, 오름차순으로 정렬됩니다.
내림차순으로 정렬하려면 comparator를 직접 구현해서 인자로 전달해야 합니다.
import java.util.stream.Stream;
public class Example {
public static void main(String[] args) {
Stream<String> words = Stream.of("apple", "banana", "cherry", "date");
words.sorted().forEach(System.out::println);
}
}
Output:
apple
banana
cherry
date
예제 3. Custom class의 스트림 정렬
String, Integer 같은 기본 자료형 외에, 직접 정의한 Custom class 객체의 스트림도 sorted()
로 정렬할 수 있습니다.
Custom class에 Comparable가 구현되어있지 않은 경우 어떻게 비교할지 모르기 때문에, sorted()
에 인자로 Comparator 구현부를 전달해야 합니다.
sorted()
의 인자로 comparator 전달, Person 객체의 name 값을 오름차순으로 비교(p1, p2) -> p1.getName().compareTo(p2.getName())
: 객체의 이름을 오름차순으로 비교하여 정렬
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Example {
public static void main(String[] args) {
Stream<Person> people = Stream.of(new Person("Alice"),
new Person("Charlie"),
new Person("Bob"));
List<Person> sortedPeople = people.sorted(
(p1, p2) -> p1.getName().compareTo(p2.getName())).collect(Collectors.toList());
sortedPeople.forEach(person -> System.out.println(person.getName()));
}
}
Output:
Alice
Bob
Charlie
예제 4. Comparable이 구현된 Custom class
Custom class 스트림을 정렬할 때, Comparator를 전달하지 않고 sorted()
만 호출하여 동작하도록 하려면, Custom 클래스에 Comparable을 구현해야 합니다.
아래 예제는 Person 클래스에 Comparable을 구현하였으며, Comparator 전달 없이 sorted()
만 호출하여 정렬합니다.
class Person implements Comparable<Person>
: Comparable 구현this.getName().compareTo(person.getName())
: 이름을 오름차순으로 비교
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Person implements Comparable<Person> {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public int compareTo(Person person) {
return this.getName().compareTo(person.getName());
}
}
public class Example {
public static void main(String[] args) {
Stream<Person> people = Stream.of(new Person("Alice"),
new Person("Charlie"),
new Person("Bob"));
List<Person> sortedPeople = people.sorted().collect(Collectors.toList());
sortedPeople.forEach(person -> System.out.println(person.getName()));
}
}
Output:
Alice
Bob
Charlie