Java 정렬의 Comparable 인터페이스와 Comparator 인터페이스의 비교 및 응용 예

Java 정렬의 Comparable 인터페이스와 Comparator 인터페이스의 비교 및 응용 예
1. 사실은 매우 간단하다. 글자로만 이해하면 기본적으로 안다.Comparable: "비교할 수 있다", (비교에 참여하고자 하는 대상이 대응하는 원소류는 Comparable 인터페이스를 실현해야 한다) 이런 전략을 사용하여 비교할 때 두 대상(여기서 두 대상은 한 종류의 두 가지 다른 실례를 가리킨다) 자체는 반드시 "비교할 수 있다"는 것이어야 한다. 비교의 기준은 대상이 있는 클래스에 의해 정의되고 이런 비교할 수 있는 능력은 대상 자체의 고유한 것이기 때문에 제3자가 참여하지 않아도 비교를 완성할 수 있다.두 대상 자체를 비교할 수 있도록 하려면 대상이 있는 클래스는Comparable 인터페이스를 실현해야만 한다.그 compareTo () 방법은 매개 변수만 있습니다. 여기는 '너', '나' 관계만 있고 제3자는 없습니다.예를 들어 두 사람이 키를 비교하고 키가 작은지 분별하는 것은 인류 고유의 능력으로 두 사람이 함께 서기만 하면 누가 크고 누가 작은지 분별할 수 있다.
2. Comparator: 비교기가 이런 전략을 사용하여 비교할 때 어떻게 비교하는지는 두 대상 자체와 상관없이 제3자(즉 비교기)가 완성한다.제3자 비교기 클래스는 별도의 전문적인 설계를 필요로 한다.Comparator 인터페이스를 실현하면 어떤 클래스(대상)도 하나의'비교기'가 될 수 있지만 비교기는 자신의 실례를 비교하는 것이 아니라 다른 클래스의 두 개의 서로 다른 대상을 비교한다. 비교기는 여기서'중재자'의 역할을 한다. 이것은compare() 방법에 두 개의 파라미터가 필요한 이유이다.예를 들어 두 사람이 누구의 지능이 더 높은지 비교하려면 그들 자신에 의해 진행할 수 없기 때문에 이때는 비교기(예를 들어 지능 테스트 문제)를 빌려야 한다.
주:Comparable와Comparator 두 인터페이스는 집합 인터페이스(Collection) 자체와 무관하지만 집합 내의 요소와 관련이 있습니다. 집합의 정렬은 이 두 정렬 인터페이스의 방법을 사용해야 하기 때문입니다(둘 중 하나를 선택하십시오).한 종류의 여러 실례가 정렬을 실현하려면Comparable를 실현하거나 해당하는Comparator를 제공해야만 Collections를 사용할 수 있다.sort () 를 정렬합니다.
여기에 우리는 전문적으로 설명해야 한다:java.util.Collections는 자바의 집합 프레임워크에 속하지 않고 집합된 도구 클래스입니다. 정렬, 복사, 일치 찾기 등 전문적인 조작 집합 (Collection) 의 정적 방법을 포함합니다. 예를 들어 우리가 자주 사용하는 정렬 방법: Collections.sort(List), Collections.sort(List, Comparator). 2. 코드 예시
1. 만약에 당신이 간단한 직원 데이터베이스를 유지하고 있다면 모든 직원은 Employee류의 실례입니다.
Employee 클래스는 다음과 같이 정의할 수 있습니다.
public class Employee {	
	private String num;
	private String name;
	private int age;
	private int salary;	
	public Employee(String num, String name) {
		this.num = num;
		this.name = name;
	}	
	public void setName(String newNum) {
		num = newNum;
	}

	public void setAge(int newAge) {
		age = newAge;
	}
	public void setSalary(int newSalary) {
		salary = newSalary;
	}
	public String getNum() {
		return num;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	public int getSalary() {
		return salary;
	}
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("Employee Information:");
		sb.append("
"); sb.append("Number:"); sb.append(getNum()); sb.append("
"); sb.append("Name:"); sb.append(getName()); sb.append("
"); sb.append("Age:"); sb.append(getAge()); sb.append("
"); sb.append("Salary:"); sb.append(getSalary()); sb.append("
"); return sb.toString(); } }
Employee Database 클래스는 Employee 클래스의 인스턴스를 만들고 이를 컬렉션에 저장합니다.
import java.util.*;

public class EmployeeDatabase {
	
	public static void main(String[] args) {
		
		List<Employee> allEmployees = new ArrayList<Employee>();
		
		Employee employee1 = new Employee("AAA", "Barack Omaba");
		employee1.setAge(50);
		employee1.setSalary(9999);
		allEmployees.add(employee1);
		
		Employee employee2 = new Employee("BBB", "George Bush");
		employee2.setAge(60);
		employee2.setSalary(5999);
		allEmployees.add(employee2);
		
		System.out.println(allEmployees);

	}

}

2. 현재 모든 직원을 검색해서 일정한 순서대로 표시해야 한다(예를 들어 나이에 따라 늘어나는 것). 이때Collections를 사용해야 한다.sort () 방법.
Collections.sort()에는 두 가지 전략이 있다. 하나는 집합 중의 원소가 속하는 클래스 자체를Comparable 인터페이스를 실현하게 하는 것이고, 다른 하나는 사용자가 따로 제공한 비교기(즉Comparator)를 사용하는 것이다.
2.1 첫 번째 정책을 사용할 때는 요소 클래스의 정의를 수정해야 합니다.
Comparable 인터페이스를 구현하려면 Employee 클래스를 다음과 같이 수정해야 합니다.
public class Employee implements Comparable<Employee> {
	
	public int compareTo(Employee another) {
		return getAge() - another.getAge();
	}
	
	//  

}
왜냐하면
compareTo () 메서드는 이 객체가 다른 객체보다 크면 0보다 큰 정수를 반환하고 0보다 작으면 0보다 작은 정수를 반환하며 0보다 작으면 0을 반환한다고 약정합니다.따라서 두 사람의 나이 차로 직접 돌아가 나이별 비교를 실현할 수 있다.
이렇게 하면main() 방법에서Collections를 사용할 수 있다.sort(allEmployees);자, 직원들 나이순으로 정렬할게요.
그러나 이런 정렬은 매우 원활하지 않다.
첫째, 집합 요소 클래스 Employee를 수정해야 하는데, 많은 경우, 우리는 공공 클래스를 수정할 방법이 없다.
둘째, 번호, 이름, 월급 등 다양한 방식으로 순서를 정할 방법이 없다.
2.2 이 때 다른 정책을 사용하여 비교기 클래스를 만들어야 하는데 Comparator 인터페이스를 실현해야 한다.Comparator는 compare () 방법으로 되돌아오는 정수를 사용하여 두 대상을 비교합니다. 규칙은 compareTo () 와 같습니다.
마찬가지로 나이 비교를 실현하면,
Comparator를 사용할 때 Employee 클래스를 수정할 필요가 없고 정렬할 때 해당하는 비교기를 정의할 수 있습니다.Collections. 사용sort() 메서드의 다른 버전:
Collections.sort(allEmployees, new Comparator<Employee>() {
	public int compare(Employee one, Employee another) {
		return one.getAge() - another.getAge();
	}
});

여기 코드가 사용됐어요.
익명 내부 클래스
비교기 클래스를 먼저 정의하는 것과 같습니다.
class EmployeeComparator implements Comparator<Employee> {
	
	public int compare(Employee one, Employee another) {
		return one.getAge() - another.getAge();
	}
	
}
재사용:
Collections.sort(allEmployees, new EmployeeComparator());
에서 비교기는 원소류 Employee와 완전히 독립되어 있어 정렬 규칙을 쉽게 수정할 수 있음을 알 수 있다.
정렬할 때 선택할 수 있는 일련의 비교기를 정의할 수도 있습니다. 예를 들어,
//  
class EmployeeSalaryAscendingComparator implements Comparator<Employee> {
	
	public int compare(Employee one, Employee another) {
		return one.getSalary() - another.getSalary();
	}
	
}

//  
class EmployeeSalaryDescendingComparator implements Comparator<Employee> {
	
	public int compare(Employee one, Employee another) {
		return another.getSalary() - one.getSalary();
	}
	
}
해당하는 사용 방법:
Collections.sort(allEmployees, new EmployeeSalaryAscendingComparator());
Collections.sort(allEmployees, new EmployeeSalaryDescendingComparator());
잠깐만...
Comparator를 사용할 때 원소류는 Comparable를 실현할 필요가 없기 때문에 우리는 최초 버전의 Employee를 유지하지만 실제 응용에서는 Comparable의compareTo() 방법으로 기본 정렬 방식을 정의하고 Comparator로 다른 정렬 방식을 정의할 수 있다.
3. - Camparable 인터페이스와 Comparator 인터페이스의 비교 요약
1.Camparable의 사용 방식은 비교하고자 하는 클래스 내부 정의에서compareTo() 방법을 실현한 다음Collections를 사용하는 것이다.sort () 는 정렬을 실현하고 Comparator는 비교하고자 하는 클래스 외부에서 정렬을 실현합니다.따라서 정렬을 실현하려면 클래스 내에서 Comparable 인터페이스를 실현하는 방법compareTo() 또는 클래스 밖에서 Comparator 인터페이스를 실현하는 방법compare()를 정의해야 한다.Comparable는 대상 자체가 비교에 필요한 인터페이스를 지원하고 (예를 들어 String, Integer 자체가 크기 비교 작업을 완성할 수 있다) Comparator는 전용 비교기입니다. 이 대상이 비교를 지원하지 않거나 비교 함수가 당신의 요구를 충족시키지 못할 때 비교기를 써서 두 대상 간의 크기 비교를 완성할 수 있습니다.2. 하나의 클래스가Camparable 인터페이스를 실현하면 이 클래스의 대상 간에 서로 비교할 수 있음을 나타낸다. 이 클래스의 대상으로 구성된 집합은sort() 방법으로 정렬할 수 있다.일반적으로 우리가 쓴 bean은 모두 이 인터페이스를 실현해야 하는데 이것도 표준javabean의 규범이다.3. Comparator는 하나의 알고리즘의 실현으로 볼 수 있다. 알고리즘과 데이터를 분리하면 Comparator도 다음과 같은 두 가지 장면에서 사용할 수 있다. 3.1류의 디자이너가 비교 문제를 고려하지 않고 Camparable 인터페이스를 실현하지 않았기 때문에 우리는 Comparator를 통해 정렬을 실현할 수 있고 클래스 자체를 바꾸지 않아도 된다.예를 들어 당신은 제3자의 클래스를 사용했지만 이 제3자 클래스는Camparable 인터페이스를 실현할 수 있고 코드를 바꿀 수 없다. 또한 클래스가 작성된 후에 수정할 수 없지만 확대할 수 있다. 이럴 때 Comparator를 사용해서 정렬을 실현할 수 밖에 없다.3.2 오름차순, 내림차순 등 여러 가지 정렬 기준을 사용할 수 있다.예를 들어Comparable를 실현하려면 하나의 비교 방법인compareTo()만 정의할 수 있지만 때로는 하나의 집합에 대해 서로 다른 정렬 방법을 할 수 있다. 이때 다양한 Comparator를 제공하여 집합에 대한 정렬을 할 수 있고 정렬할 요소에 대해 변경할 필요가 없기 때문에 나는 Comparator가 더욱 유연성을 제공했다고 생각한다.

좋은 웹페이지 즐겨찾기