정렬 해야하는 컬렉션 또는 배열이 간단한 숫자 유형이 아닌 경우 일반적으로 비교기를 사용하거나 간단한 방식으로 객체 정렬 또는 사용자 지정 정렬을 구현할 수 있습니다.
비교 함수, 일부 객체 모음에 대한 총 순서를 부과합니다. 비교기는 정렬 순서를 정확하게 제어 할 수 있도록 정렬 메소드 (예 : Collections.Sort 또는 Array.Sort)로 전달 될 수 있습니다. 비교기는 또한 특정 데이터 구조 (정렬 된 세트 또는 정렬 된 맵과 같은)의 순서를 제어하거나 자연스러운 순서가없는 객체 모음에 대한 순서를 제공하는 데 사용될 수 있습니다. ------ API
문자열 객체가 비슷한 인터페이스를 구현하는 데 도움이되었으므로 문자열 목록을 직접 정렬 할 수 있습니다. 따라서 우리가 정렬하려면 비교기도 구현해야합니다.
1. 비교기
LinkedList에 저장된 개체를 정렬하십시오
import java.util.comparator; import java.util.linkedlist; 클래스 사람 {개인 플로트 높이; 개인 문자열 이름; 사람 (플로트 높이) {this.height = 높이; } public float getheight () {리턴 높이; } public void setheight (플로트 높이) {this.height = 높이; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; }} Class PersonHeight 구현 비교기 <person> {@override // 비교 메소드를 다시 작성하고, 반환 <0은 변경되지 않은 상태로 유지되며, 반환> 0은 순서대로 교환됩니다 (오름차순 순서) public int 비교 (Person E1, Person E2) {if (e1.getheight () <e2.getheight ()) {return 1; } else {return -1; }}} public class Question3 {public static void main (String [] args) {person p1 = 새로운 사람 (23.4f); p1.setname ( "Stud1"); 사람 P2 = 새로운 사람 (2.34F); p2.setname ( "Stud2"); 사람 P3 = 새로운 사람 (34.32f); p3.setName ( "Stud3"); 사람 P4 = 새로운 사람 (56.45f); p4. 세트 이름 ( "Stud4"); 사람 P5 = 새로운 사람 (21.4f); p5. 세트 이름 ( "Stud5"); LinkedList <Person> Al = New LinkedList <Person> (); al.add (p1); al.add (p2); al.add (p3); al.add (p4); al.add (p5); // 정렬 메소드를 호출하여 정렬 Collections.sort (al, new PersonHeight ()); // (person p : al) system.out.println (p.getName ())의 출력을 트랜스 립합니다. }}
첨부된:
// 날짜를 정렬/*** O1이 O2보다 낮 으면 음수를 반환하십시오. O1이 O2보다 큰 경우 양수를 반환하십시오. 동일하다면 0을 반환하십시오. */@reverridepublic int compar (단계 o1, 단계 o2) {날짜 accepttime1 = utiltool.strtodate (o1.getAcceptTime (), null); 날짜 accepttime2 = utiltool.strtodate (o2.getAcceptTime (), null); // 날짜 필드를 오름차순, 내려 가려면 이전 메소드를 사용할 수 있습니다. 반환 -1;}2. 비슷합니다
import java.util.collections; import java.util.comparator; import java.util.linkedlist; 클래스 개인 구현 {private float height; 개인 문자열 이름; 사람 (플로트 높이) {this.height = 높이; } public float getheight () {리턴 높이; } public void setheight (플로트 높이) {this.height = 높이; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } @override public int compareto (object o) {// todo 자동 생성 메소드 스터브 if (this.height> ((사람) o) .height)) {return 1; } else return -1; }} public class Question3 {public static void main (String [] args) {person p1 = 새로운 사람 (23.4f); p1.setname ( "Stud1"); 사람 P2 = 새로운 사람 (2.34F); p2.setname ( "Stud2"); 사람 P3 = 새로운 사람 (34.32f); p3.setName ( "Stud3"); 사람 P4 = 새로운 사람 (56.45f); p4. 세트 이름 ( "Stud4"); 사람 P5 = 새로운 사람 (21.4f); p5. 세트 이름 ( "Stud5"); LinkedList <Person> Al = New LinkedList <Person> (); al.add (p1); al.add (p2); al.add (p3); al.add (p4); al.add (p5); collections.sort (al); for (person p : al) system.out.println (p.getName ()); }}삼. 비교
비교할 수있는 사람은 사람 클래스 내부에서 정의됩니다.
비교기는 사람 외부에서 정의됩니다. 현재, 우리 개인 수업의 구조는 변경 될 필요가 없습니다.
두 가지 방법에는 고유 한 장점과 단점이 있습니다. 비교할 수있는 것은 간단합니다. 비슷한 인터페이스를 구현하는 객체가 비슷한 객체가되는 한 소스 코드를 수정해야합니다. 비교기 사용의 장점은 소스 코드를 수정할 필요가 없지만 비교기를 구현한다는 것입니다. 사용자 정의 객체를 비교 해야하는 경우 비교기와 객체를 함께 전달하여 크기를 비교할 수 있습니다. 비교기에서는 사용자가 스스로 복잡하고 일반적인 논리를 구현하여 비교적 간단한 물체와 일치 할 수있어 많은 반복적 인 노동을 절약 할 수 있습니다.