Java에서 비교기 정렬

Rashmi Patidar 2023년10월12일
  1. DepartmentComparator를 사용하여 Java에서 요소 정렬
  2. Java 8에서lambda함수를 사용하여 위의 프로그램 수정
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을 발생시킵니다. 이 메서드는 목록 컬렉션을 첫 번째 인수로 사용하고 수동 비교기를 두 번째 인수로 사용합니다.

LexicographicComparatorYearComparator클래스가 수동 비교를 위해 생성됩니다. 클래스는 비교를 기반으로int값을 리턴하는 단일 메소드compareComparator기능적 인터페이스를 구현합니다. 메서드는 사용자 지정 구현이 정의 될 수있는 사용자 정의 클래스에서 재정의됩니다.

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는 함수를 인수로 취급하며 인스턴스화에 클래스가 필요하지 않습니다. 이 함수는 매개 변수를 가져와 별도의 클래스 대신 동일한 행에서 구현을 제공합니다.

위 프로그램의 출력은 첫 번째 코드의 출력과 동일합니다.

Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

관련 문장 - Java Comparator

관련 문장 - Java Sort