이 질문에는 이미 답변이 있습니다.
개체의 속성 중 하나를 기반으로 개체의 배열 목록을 정렬하려면 여기 내 코드 '이름'에서 말할 수있는 검색 및이 옵션에 대한 'Comparator'사용에 대한 발견, 아래 클래스는 내 개체입니다 :
public class PhoneBook{
long number;
String name;
String family;
String address;
public long getNumber() {
return number;
}
public void setNumber(long number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFamily() {
return family;
}
public void setFamily(String family) {
this.family = family;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
그리고 내 sort 메소드에서 'compare'메소드를 오버라이드한다.
public void sort()
{
Collections.sort(phoneBooks, new Comparator<PhoneBook>() {
@Override
public int compare(PhoneBook o1, PhoneBook o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
});
}
하지만 내 문제는 왜 이런 식으로 첫 번째 코드에서 'Comparable'을 구현하지 않고 혼란스러워하는 것입니다 :
public class PhoneBook implements Comparable<PhoneBook>
정렬 방법이 잘 작동하고 실제로 위의 코드를 시도하고 오류가 발생하여 구현 부분이 제거되었지만 작동하는 것으로 나타났습니다.
비교 가능 :
비교기 :
Comparator는 여러 정렬 순서를 제공합니다. 즉, 우리는 다음과 같은 여러 요소를 기반으로 컬렉션을 정렬 할 수 있습니다. 이드, 이름 및 가격 등
Comparator는 원래 클래스, 즉 실제 클래스에 영향을주지 않습니다. 수정되지 않았습니다.
Comparator는 compare () 메서드를 사용하여 요소를 정렬합니다.
Comparator 타입의리스트 요소를 Collections.sort (List, Comparator) 메서드입니다.
여기에 원하는 것을 할 수있는 두 가지 방법이 있습니다. 하나는 사용자 정의를 사용하는 것입니다.Comperator
(위에서 한 것처럼), 두 번째는Comperable
인터페이스.
둘 다 할 필요는 없습니다.
첫 번째 방법 (비교기) - 비교자를 사용하여 sort 메소드를 실행하면 정렬 메소드가 오브젝트를 비교하기 위해이를 사용합니다. 비교자를 사용하기 때문에 구현할 필요가 없습니다.compareTo
과Comparable
두 번째 방법 (comperable) - 당신은 comperator없이 sort 메소드를 실행한다. 여기서 일어나는 일은 sort 메소드가compareTo
방법Comperable
개체에 구현 한 인터페이스
어느 쪽이든 작동하지만 두 가지 모두 필요하지는 않습니다.
두 가지가있다Collections.sort()
행동 양식.
처음에는Collection
정렬 및 사용compareTo
방법. 이 경우 클래스가 구현해야합니다.Comparable
.
다른 하나는너는 사용했다.두 개의 인수를받습니다.Collection
두 번째는Comparator
. 이 클래스는 클래스를 구현하는지 상관하지 않습니다.Comparable<? super YourClass>
제공된대로 사용함Comparator
.
함수 인터페이스를 구현할 때 Lambda가 유용합니다.
Collections.sort(phoneBooks, (o1, o2)-> o1.getName().compareToIgnoreCase(o2.getName()));