소개
이 랩에서는 Java 에서 리스트가 정렬되었는지 확인하는 방법을 배우게 됩니다. 이 작업을 수행하기 위한 다양한 접근 방식을 살펴보고, 리스트 내의 인접한 요소를 비교하는 기본적인 방법부터 시작합니다.
그런 다음, 정렬 확인을 수행하기 위한 보다 간결하고 잠재적으로 효율적인 방법으로 Java Stream API 의 강력한 기능을 활용하는 방법을 배우게 됩니다. 마지막으로, 오름차순 및 내림차순과 같은 다양한 정렬 순서를 처리하여 정렬 확인을 더욱 다재다능하게 만드는 방법을 다룰 것입니다.
인접 리스트 요소 비교
이 단계에서는 리스트 (또는 더 구체적으로 Java 의 List) 의 인접 요소를 비교하는 방법을 배우게 됩니다. 이는 데이터 시퀀스 내에서 패턴이나 순서를 확인해야 할 때 흔히 사용되는 작업입니다. 먼저, 리스트를 반복하고 각 요소를 바로 다음 요소와 비교하는 루프를 사용하는 간단한 Java 프로그램을 만들어 보겠습니다.
먼저, ~/project 디렉토리에 ListComparison.java라는 새 Java 파일을 만들어 보겠습니다. 웹 IDE 의 왼쪽 파일 탐색기를 사용하여 이 작업을 수행할 수 있습니다. ~/project 영역을 마우스 오른쪽 버튼으로 클릭하고 "New File"을 선택한 다음 ListComparison.java를 입력합니다.
이제 편집기에서 ListComparison.java 파일을 열고 다음 코드를 추가합니다.
import java.util.ArrayList;
import java.util.List;
public class ListComparison {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(3);
numbers.add(2);
numbers.add(4);
numbers.add(5);
System.out.println("Original list: " + numbers);
// Loop through the list, comparing adjacent elements
for (int i = 0; i < numbers.size() - 1; i++) {
Integer currentElement = numbers.get(i);
Integer nextElement = numbers.get(i + 1);
System.out.println("Comparing " + currentElement + " and " + nextElement);
if (currentElement < nextElement) {
System.out.println(currentElement + " is less than " + nextElement);
} else if (currentElement > nextElement) {
System.out.println(currentElement + " is greater than " + nextElement);
} else {
System.out.println(currentElement + " is equal to " + nextElement);
}
}
}
}
이 코드를 자세히 살펴보겠습니다.
import java.util.ArrayList;및import java.util.List;: 이 줄은 Java 에서 리스트 작업을 위해 필요한 클래스를 가져옵니다.List<Integer> numbers = new ArrayList<>();: 이는Integer(정수) 객체를 담을 수 있는numbers라는 새 리스트를 생성합니다.numbers.add(...): 이 줄은 리스트에 요소를 추가합니다.for (int i = 0; i < numbers.size() - 1; i++): 이는 리스트를 반복하는for루프입니다. 루프 조건이i < numbers.size() - 1임을 확인하십시오. 이는numbers.get(i)를numbers.get(i + 1)과 비교하기 때문에 중요합니다.numbers.size()까지 루프하면 마지막 반복에서i + 1이 범위를 벗어납니다.Integer currentElement = numbers.get(i);: 이는 현재 인덱스i의 요소를 가져옵니다.Integer nextElement = numbers.get(i + 1);: 이는 다음 인덱스i + 1의 요소를 가져옵니다.System.out.println(...): 이 줄은 콘솔에 정보를 출력하여 비교되는 요소와 비교 결과를 보여줍니다.if,else if,else: 이는currentElement가nextElement보다 작은지, 큰지 또는 같은지 확인하는 조건문입니다.
ListComparison.java 파일을 저장합니다 (Ctrl+S 또는 Cmd+S).
이제 프로그램을 컴파일하고 실행해 보겠습니다. 웹 IDE 하단의 터미널을 엽니다. ~/project 디렉토리에 있는지 확인합니다 (필요한 경우 cd ~/project를 사용할 수 있습니다).
javac를 사용하여 코드를 컴파일합니다.
javac ListComparison.java
오류가 없으면 ListComparison.class 파일이 생성됩니다. 이제 java를 사용하여 컴파일된 코드를 실행합니다.
java ListComparison
다음과 유사한 출력이 표시됩니다.
Original list: [1, 3, 2, 4, 5]
Comparing 1 and 3
1 is less than 3
Comparing 3 and 2
3 is greater than 2
Comparing 2 and 4
2 is less than 4
Comparing 4 and 5
4 is less than 5
이 출력은 프로그램이 리스트를 성공적으로 반복하고 각 인접 요소 쌍을 비교하여 각 비교의 결과를 출력했음을 보여줍니다.
Stream API 를 사용하여 정렬 여부 확인
이 단계에서는 Java 의 Stream API 를 사용하여 리스트가 정렬되었는지 확인하는 보다 현대적이고 종종 더 간결한 방법을 살펴보겠습니다. Java 8 에 도입된 Stream API 는 데이터 컬렉션을 처리하는 함수형 접근 방식을 제공합니다.
스트림을 사용하여 리스트가 오름차순으로 정렬되었는지 확인하는 메서드를 포함하도록 이전 프로그램을 수정합니다.
웹 IDE 편집기에서 ListComparison.java 파일을 엽니다. main 메서드 외부, ListComparison 클래스 중괄호 {} 내부에 isSortedAscending이라는 새 메서드를 ListComparison 클래스에 추가합니다.
다음은 ListComparison.java에 대한 업데이트된 코드입니다.
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
public class ListComparison {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(3);
numbers.add(2);
numbers.add(4);
numbers.add(5);
System.out.println("Original list: " + numbers);
// Check if the list is sorted using the new method
boolean sorted = isSortedAscending(numbers);
if (sorted) {
System.out.println("The list is sorted in ascending order.");
} else {
System.out.println("The list is NOT sorted in ascending order.");
}
// The previous loop for comparison is removed for simplicity in this step
// but you can keep it if you want to see both methods in action.
}
// Method to check if the list is sorted in ascending order using Streams
public static boolean isSortedAscending(List<Integer> list) {
if (list == null || list.size() <= 1) {
return true; // An empty or single-element list is considered sorted
}
return IntStream.range(0, list.size() - 1)
.allMatch(i -> list.get(i).compareTo(list.get(i + 1)) <= 0);
}
}
새로운 부분을 살펴보겠습니다.
import java.util.stream.IntStream;: 이는 스트림에서 정수 시퀀스를 사용하는 데 유용한IntStream클래스를 가져옵니다.public static boolean isSortedAscending(List<Integer> list): 이는Integer의List를 받아boolean을 반환하는 (정렬된 경우 true, 그렇지 않은 경우 false)isSortedAscending이라는 새 정적 메서드를 선언합니다.if (list == null || list.size() <= 1): 이는 가장자리 경우를 처리합니다. 빈 리스트 또는 요소가 하나뿐인 리스트는 항상 정렬된 것으로 간주됩니다.IntStream.range(0, list.size() - 1): 이는 0 부터list.size() - 1까지 (포함하지 않음) 의 정수 스트림을 생성합니다. 이러한 정수는 비교하려는 리스트 요소의 인덱스를 나타냅니다..allMatch(i -> list.get(i).compareTo(list.get(i + 1)) <= 0): 이는 스트림 작업의 핵심입니다.allMatch()는 스트림의 모든 요소가 주어진 조건을 충족하는지 확인하는 터미널 작업입니다.i -> list.get(i).compareTo(list.get(i + 1)) <= 0은 조건을 정의하는 람다 표현식입니다.IntStream의 각 인덱스i에 대해 인덱스i의 요소와 인덱스i + 1의 요소를 가져옵니다.list.get(i).compareTo(list.get(i + 1))는 두 요소를 비교합니다.compareTo는 첫 번째 요소가 두 번째 요소보다 작으면 음수 정수를, 같으면 0 을, 첫 번째 요소가 두 번째 요소보다 크면 양수 정수를 반환합니다.<= 0은compareTo의 결과가 0 보다 작거나 같은지 확인합니다. 이 조건은 현재 요소가 다음 요소보다 작거나 같으면 true 가 되며, 이는 오름차순의 정의입니다.allMatch는 이 조건이 리스트의 모든 인접 쌍에 대해 true 인 경우에만true를 반환합니다.
ListComparison.java 파일을 저장합니다.
이제 터미널에서 업데이트된 프로그램을 컴파일하고 실행합니다.
javac ListComparison.java
java ListComparison
이제 출력은 isSortedAscending 메서드를 기반으로 리스트가 오름차순으로 정렬되었는지 여부를 나타내야 합니다.
Original list: [1, 3, 2, 4, 5]
The list is NOT sorted in ascending order.
main 메서드의 리스트를 정렬되도록 수정합니다. 예를 들어, 다음과 같이 수정합니다.
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
파일을 저장하고, 컴파일하고, 다시 실행합니다. 이제 출력은 다음과 같아야 합니다.
Original list: [1, 2, 3, 4, 5]
The list is sorted in ascending order.
이는 Stream API 를 사용하여 오름차순을 간결하게 확인하는 방법을 보여줍니다.
다양한 정렬 순서 처리
이전 단계에서는 리스트가 오름차순으로 정렬되었는지 확인하는 메서드를 만들었습니다. 이 단계에서는 프로그램을 확장하여 오름차순 및 내림차순과 같은 다양한 정렬 순서를 처리합니다. 리스트와 원하는 정렬 순서를 입력으로 받는 새 메서드를 추가합니다.
웹 IDE 편집기에서 ListComparison.java 파일을 엽니다. 리스트와 오름차순 (true) 또는 내림차순 (false) 으로 확인할지 여부를 나타내는 boolean을 입력으로 받는 isSorted라는 새 메서드를 추가합니다.
다음은 ListComparison.java에 대한 업데이트된 코드입니다.
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
public class ListComparison {
public static void main(String[] args) {
List<Integer> numbersAsc = new ArrayList<>();
numbersAsc.add(1);
numbersAsc.add(2);
numbersAsc.add(3);
numbersAsc.add(4);
numbersAsc.add(5);
List<Integer> numbersDesc = new ArrayList<>();
numbersDesc.add(5);
numbersDesc.add(4);
numbersDesc.add(3);
numbersDesc.add(2);
numbersDesc.add(1);
List<Integer> numbersUnsorted = new ArrayList<>();
numbersUnsorted.add(1);
numbersUnsorted.add(3);
numbersUnsorted.add(2);
numbersUnsorted.add(4);
numbersUnsorted.add(5);
System.out.println("Checking list: " + numbersAsc);
System.out.println("Is ascending sorted? " + isSorted(numbersAsc, true));
System.out.println("Is descending sorted? " + isSorted(numbersAsc, false));
System.out.println();
System.out.println("Checking list: " + numbersDesc);
System.out.println("Is ascending sorted? " + isSorted(numbersDesc, true));
System.out.println("Is descending sorted? " + isSorted(numbersDesc, false));
System.out.println();
System.out.println("Checking list: " + numbersUnsorted);
System.out.println("Is ascending sorted? " + isSorted(numbersUnsorted, true));
System.out.println("Is descending sorted? " + isSorted(numbersUnsorted, false));
System.out.println();
}
// Method to check if the list is sorted based on the specified order
public static boolean isSorted(List<Integer> list, boolean ascending) {
if (list == null || list.size() <= 1) {
return true; // An empty or single-element list is considered sorted
}
return IntStream.range(0, list.size() - 1)
.allMatch(i -> {
int comparison = list.get(i).compareTo(list.get(i + 1));
if (ascending) {
return comparison <= 0; // For ascending, current must be <= next
} else {
return comparison >= 0; // For descending, current must be >= next
}
});
}
}
변경 사항을 살펴보겠습니다.
main에서 세 개의 다른 리스트를 만들었습니다.numbersAsc(오름차순 정렬),numbersDesc(내림차순 정렬) 및numbersUnsorted.- 각 리스트와
ascending매개변수에 대해true(오름차순) 와false(내림차순) 를 모두 사용하여 새isSorted메서드를 호출합니다. public static boolean isSorted(List<Integer> list, boolean ascending): 이는 리스트와 순서에 대한 부울 플래그를 허용하는 새로운 메서드 시그니처입니다.allMatch람다 내부:int comparison = list.get(i).compareTo(list.get(i + 1));: 인접 요소 간의 비교를 수행합니다.if (ascending):ascending플래그가 true 이면comparison <= 0(현재가 다음보다 작거나 같음) 인지 확인합니다.else:ascending플래그가 false 이면 (내림차순을 확인하는 경우)comparison >= 0(현재가 다음보다 크거나 같음) 인지 확인합니다.
ListComparison.java 파일을 저장합니다.
이제 터미널에서 업데이트된 프로그램을 컴파일하고 실행합니다.
javac ListComparison.java
java ListComparison
출력은 각 리스트를 오름차순 및 내림차순으로 확인한 결과를 표시해야 합니다.
Checking list: [1, 2, 3, 4, 5]
Is ascending sorted? true
Is descending sorted? false
Checking list: [5, 4, 3, 2, 1]
Is ascending sorted? false
Is descending sorted? true
Checking list: [1, 3, 2, 4, 5]
Is ascending sorted? false
Is descending sorted? false
이는 입력 매개변수를 기반으로 비교 논리를 조정하여 Stream API 를 사용하여 다양한 정렬 순서를 확인하는 유연한 메서드를 만드는 방법을 보여줍니다.
요약
이 랩에서는 다양한 접근 방식을 사용하여 Java 에서 리스트가 정렬되었는지 확인하는 방법을 배웠습니다. 먼저, 전통적인 루프를 사용하여 리스트의 인접 요소를 비교하는 메서드를 구현하여 정렬 확인 로직에 대한 기본적인 이해를 제공했습니다. 여기에는 리스트를 반복하고 각 요소를 후속 요소와 비교하여 정렬되지 않은 쌍을 식별하는 작업이 포함되었습니다.
그런 다음, 리스트 정렬 여부를 확인하기 위해 보다 간결하고 기능적인 접근 방식을 위해 Java Stream API 를 활용하는 방법을 살펴보았습니다. 이 메서드는 스트림 연산을 사용하여 요소가 원하는 순서로 정렬되었는지 효율적으로 확인합니다. 마지막으로, 정렬 확인을 수행할 때 다양한 정렬 순서 (오름차순 및 내림차순) 를 처리하여 다양한 정렬 요구 사항을 수용하도록 비교 로직을 조정하는 방법을 시연했습니다.



