HOWTO · Java
Java에서 비교기 정렬
이 기사에서는 Java의 정렬 비교기와 사용 방법을 소개합니다.
이 기사에서는 Java의 정렬 비교기가 무엇인지 정의하고 프로세스에서이를 사용하는 방법을 보여줍니다. 이 개념을 더 잘 이해하는 데 도움이되는 프로그램이 포함되어 있습니다.
DepartmentComparator를 사용하여 Java에서 요소 정렬
‘정렬’은 명확한 순차적 인 순서로 ‘목록’배열과 같은 데이터 구조를 배열하는 과정입니다. 이 프로세스는 데이터 요소를 비교하여 작동하므로 새 위치를 정의합니다. 구조의 복잡성에 따라 유용한 다양한 유형의 정렬 알고리즘이 Java에 정의되어 있습니다.
다음은 요소 정렬을위한 구현을 제공하기 위해 비교기 인터페이스 재정의를 정의하는 코드 블록입니다.
import java.util.*;
public class DepartmentComparator {
public static void main(String[] args) {
List<Department> departments = Arrays.asList(new Department("dept1", 2001),
new Department("dept2", 1998), new Department("dept3", 2021));
Collections.sort(departments, new LexicographicComparator());
System.out.println("Sorting on the basis of name: " + departments);
Collections.sort(departments, new YearComparator());
System.out.println("Sorting on the basis of year: " + departments);
}
static class LexicographicComparator implements Comparator<Department> {
@Override
public int compare(Department a, Department b) {
return a.name.compareToIgnoreCase(b.name);
}
}
static class YearComparator implements Comparator<Department> {
@Override
public int compare(Department a, Department b) {
return a.establish_year < b.establish_year ? -1
: a.establish_year == b.establish_year ? 0
: 1;
}
}
static class Department {
String name;
int establish_year;
Department(String n, int a) {
name = n;
establish_year = a;
}
@Override
public String toString() {
return String.format("{name=%s, Establish Year=%d}", name, establish_year);
}
}
}
위의 프로그램에서DepartmentComparator클래스는 기본 메소드를 보유하고 드라이버 코드 역할을하는 공용 클래스입니다. 메인 클래스 외에 기능을 보여주기 위해 추가 된 비공개 클래스가 코드에 있습니다. Department클래스는 필드 이름과establish_year변수를 보유하고toString()함수를 대체하는 POJO입니다. 빈 클래스 외에LexicographicComparator클래스와YearComparator클래스는Comparator인터페이스를 구현합니다.
정적 메서드에서List는 3 개의 요소로 초기화됩니다. Array.asList는 고정 크기List를 리턴하는 정적 메소드입니다. 이 함수는 클래스의 인스턴스를 사용하여 목록으로 변환합니다. 따라서department class인스턴스는 새 키워드를 사용하여 생성되며 이제parameterized생성자라고합니다. 이 생성자는 이름을 초기화하고 전달 된 매개 변수에서 1 년을 설정합니다.
목록이 생성되면Collections클래스의sort메소드가 호출됩니다. 주어진 비교자를 기반으로 정의 된 목록 또는 컬렉션을 정렬합니다. 이 메서드는 수동 비교기를 사용하고 void를 반환하지만 인수로 전달 된 컬렉션을 수정합니다. 이 메소드는 요소가 다른 유형일 때ClassCastException을 발생시킵니다. 이 메서드는 목록 컬렉션을 첫 번째 인수로 사용하고 수동 비교기를 두 번째 인수로 사용합니다.
LexicographicComparator및YearComparator클래스가 수동 비교를 위해 생성됩니다. 클래스는 비교를 기반으로int값을 리턴하는 단일 메소드compare로Comparator인기능적 인터페이스를 구현합니다. 메서드는 사용자 지정 구현이 정의 될 수있는 사용자 정의 클래스에서 재정의됩니다.
LexicographicComparator클래스에서 메소드는 이름을 기반으로 조건을 지정하고 전달 된 인수를 비교하며 입력이 더 작은 지, 더 큰지 또는 동일한 지에 따라-1,0또는1을 리턴합니다. 서로에게. 마찬가지로YearComparator메소드는 인수로 전달 된 연도를 비교하기 위해 재정의됩니다.
아래는 이름, 오름차순 및 연도별로 정렬 된 출력입니다.
Sorting on the basis of name: [{name=dept1, Establish Year=2001}, {name=dept2, Establish Year=1998}, {name=dept3, Establish Year=2021}]
Sorting on the basis of year: [{name=dept2, Establish Year=1998}, {name=dept1, Establish Year=2001}, {name=dept3, Establish Year=2021}]
Java 8에서lambda함수를 사용하여 위의 프로그램 수정
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class DepartmentCompareUsingJava8 {
public static void main(String[] args) {
List<DepartmentComparator.Department> departments =
Arrays.asList(new DepartmentComparator.Department("dept1", 2001),
new DepartmentComparator.Department("dept2", 1998),
new DepartmentComparator.Department("dept3", 2021));
Collections.sort(departments, (a, b) -> a.name.compareToIgnoreCase(b.name));
System.out.println(departments);
Collections.sort(departments,
(a, b)
-> a.establish_year < b.establish_year ? -1
: a.establish_year == b.establish_year ? 0
: 1);
System.out.println(departments);
}
}
이 프로그램의 차이점은 Comparator 인터페이스를 구현하는 새 클래스를 정의하는 대신Java 8 기능 인터페이스가 매번 새 클래스에서 처리 오버 헤드를 줄이는 데 도움이된다는 것입니다. Functional Interface에는 구현되지 않은 단일 메소드 또는abstract메소드가 있습니다. 인터페이스를 구현하고 자체 메서드 버전을 제공하는 클래스를 만드는 오버 헤드를 줄입니다.
람다()->함수를 사용하여 메서드를 직접 호출합니다. Lambda는 함수를 인수로 취급하며 인스턴스화에 클래스가 필요하지 않습니다. 이 함수는 매개 변수를 가져와 별도의 클래스 대신 동일한 행에서 구현을 제공합니다.
위 프로그램의 출력은 첫 번째 코드의 출력과 동일합니다.