<string> 목록에서 사용자 정의 클래스를 정렬하려면 목록을 정렬해야합니다. 스스로 병합하거나 힙으로 정렬 할 필요가 없습니다. 하나의 인터페이스 만 구현하십시오.
이 기사는 먼저 컬렉션을 사용하여 <string> 목록을 정렬 한 다음 Collections.sort의 원칙에 대해 이야기합니다.
사용자 정의 클래스를 정렬하는 방법에 대해 이야기 해 봅시다.
마지막으로, 컬렉션 정렬을 사용하여 사용자 정의 객체를 정렬하는 또 다른 방법이 소개되며 두 종류는 간단한 성능 비교입니다.
1. 정렬 목록의 원리 <string> 및 collections.sort
코드는 다음과 같습니다
List <string> StringList = New ArrayList <String> (); StringList.add ( "nice"); StringList.add ( "Delicious"); StringList.Add ( "ABLE"); StringList.add ( "Moon"); StringList.add ( "try"); StringList.add ( "친구"); Collections.SORT (StringList); for (string str : StringList) {System.out.println (str); }컬렉션은 java.util.collections입니다.
컬렉션에서 정렬 구현을 확인하십시오
@suppresswarnings ( "확인되지 않은") public static <t는 비슷한 <? super t >> void sort (list <t> list) {object [] array = list.toarray (); Array.SORT (배열); int i = 0; Listiterator <t> it = list.listiterator (); while (it.hasnext ()) {it.next (); it.set ((t) 배열 [i ++]); }}이것으로부터 우리는 분류 본체가 Array.Sort (Array)임을 알 수 있습니다. 배열의 정렬 구현은 다음과 같습니다
public static void sort (Object [] array) {// 시작 Android 변경 CAMPARIBEDIMSORT.SORT (Array); // 엔드 안드로이드 변화}CompartableTimsort의 정렬 구현 ComparableTimsort.sort를 계속 추적하십시오
정적 무효 정렬 (Object [] a) - 정적 무효 정렬 (개체 [] a, int lo, int hi)에서 개인 정적 void binarysort (object [] a, int lo, int hi, int start). 바이너리 소트에서 크기 비교에 사용되는 부분은 다음과 같습니다
비슷한 <bood> pivot = (비교) a [시작]; int left = lo; int right = start; 왼쪽 <= 오른쪽; while (왼쪽 <오른쪽) {int mid = (왼쪽 + 오른쪽) >>> 1; if (pivot.compareto (a [mid]) <0) right = mid; 그렇지 않으면 왼쪽 = 중간 + 1; }물체의 비교는 비교를 위해 요구 될 것이다. 기본적으로 문자열 및 정수 유형이 모두 비교 방법에 의해 상환되었습니다. 따라서 직접 비교할 수 있습니다
2. 사용자 정의 클래스 비교
위의 소개를 통해 컬렉션 분류의 원리를 이해합니다. 다음은 사용자 정의 객체의 정렬을 소개하는 것입니다. 먼저 정수와 문자열의 비교 원리를 확인한 다음 사용자 정의 클래스를 비교하는 방법을 소개하십시오.
2.1 우리는 객체의 구현을 확인한 결과 비교 방법이 없다는 것을 발견했습니다.
정수 정의를보십시오
Public Final Class Integer는 숫자 구현을 비교할 수 있습니다
문자열의 정의를 살펴 보겠습니다
공개 최종 클래스 문자열은 java.io.serializable, 비슷한 <string>, charSequence를 구현합니다
우리는 그들이 모두 비슷한 곳에서 물려 받는다는 것을 알 수 있습니다
2.2 비슷한 인터페이스를보십시오
비교할 수있는 방법은 단 하나뿐이라는 것을 알 수 있습니다.
자바 코드
공개 int 비교 (t o);
다시 말해, 바이너리 소트 방법은 실제로 비교할 수있는 비교 방법을 호출하여 비교할 수있는 것으로 알 수 있습니다.
COLLECT COLLECTION에 대한 비교를 구현하십시오.
2.3 사용자 정의 클래스 비교
다음 코드는 사용자를 정렬하는 것입니다. 먼저 이름으로 하나씩 정렬하십시오. 이름이 동일하다면 나이가 들어가서 작은 것부터 크게 정렬하십시오.
자바 코드
public class maintest {public static void main (String [] args) {list <user> userList = new ArrayList <User> (); userList.Add (새 사용자 ( "Lucy", 19)); userList.Add (새 사용자 ( "Jack", 19)); userList.Add (새 사용자 ( "Jim", 19)); userList.Add (새 사용자 ( "James", 19)); userList.Add (새 사용자 ( "헤리", 19)); userList.Add (새 사용자 ( "luccy", 19)); userList.Add (새 사용자 ( "James", 18)); userList.Add (새 사용자 ( "헤리", 20)); collections.sort (userlist); for (user user : userList) {system.out.println (user.getName () + "/t/t" + userage ()); }} private static 클래스 사용자는 <user> {private String name; 사적인 int 연령; 공개 사용자 (문자열 이름, int age) {this.name = name; this.age = age; } @override public int compareto (user oper) {int comparename = this.name.compareto (exer.getName ()); if (compareName == 0) {return (this.age == Other.getAge ()? 0 : (this.age> ever.getage ()? 1 : -1)); } 반환 비교 이름; } public String getName () {return name; } public int getage () {반환 연령; }}}실행 후 출력은 다음과 같습니다.
XML 코드 :
헤리 19 헤리 20 잭 19 제임스 18 제임스 19 Jim 19 Luccy 19 Lucy 19
두 점만 필요하다는 것을 알 수 있습니다.
에이. 비교에서 물려 받았습니다
자바 코드
개인 정적 클래스 사용자는 비슷한 <user>를 구현합니다
비. 비교 방법을 구현하십시오
위의 공개 int 비교 (사용자 또 다른)는 비교의 주제입니다.
int comparename = this.name.compareto (exer.getName ()); 비교 이름을 의미합니다
그것이 1보다 크거나 반환 된 경우, 반환 0과 같으며,보다 적은 경우 -1 .
동일하면 int 연령의 크기에 따라 비교하십시오.
위는 반환 1보다 크거나 동일하며, 위는 반환 -1보다 작으며 이는 이진 소트 비교의 기초이기도합니다.
3. 컬렉션의 과부하 기능을 사용하여 사용자 정의 객체를 정렬하십시오.
코드는 다음과 같습니다. 이름은 여전히 먼저 비교되며, 동일하면 연령 출력이 비교됩니다.
자바 코드
public class maintest {public static void main (String [] args) {list <user> userList = new ArrayList <User> (); userList.Add (새 사용자 ( "Lucy", 19)); userList.Add (새 사용자 ( "Jack", 19)); userList.Add (새 사용자 ( "Jim", 19)); userList.Add (새 사용자 ( "James", 19)); userList.Add (새 사용자 ( "헤리", 19)); userList.Add (새 사용자 ( "luccy", 19)); userList.Add (새 사용자 ( "James", 18)); userList.Add (새 사용자 ( "헤리", 20)); collections.sort (userlist, new comparator <user> () {public int compare (user user1, user user2) {int comparename = user1.getname (). compareto (user2.getname ()); if (comparename == 0) {return (user1.getage () == user2.getage () 0 :?) 비교 이름; 망자}); for (user user : userList) {system.out.println (user.getName () + "/t/t" + userage ()); }} private static 클래스 사용자 {개인 문자열 이름; 사적인 int 연령; 공개 사용자 (문자열 이름, int age) {this.name = name; this.age = age; } public String getName () {return name; } public int getage () {반환 연령; }}}당신은 그것을 볼 수 있습니다
자바 코드
collections.sort (userList, 새로운 비교기 <user> ())
그것은 비교의 주제이며 비교기의 비교 방법을 구현합니다. 다음은이 방법의 원리입니다
컬렉션을 추적합니다
자바 코드
public static <t> void 정렬 (List <T> 목록, 비교기 <? Super T> C)
도착하다
자바 코드
public static <t> void sort (t [] a, 비교기 <? super t> c)
도착하다
자바 코드
Private STATIC VOID MERGESORT (Object [] SRC, Object [] DEST, int Low, Int High, Int Off, 비교기 C)
다음과 같이 코드를 찾을 수 있습니다.
자바 코드
if (length <insertionsort_threshold) {for (int i = low; i <high; i ++) for (int j = i; j> low && c.compare (dest [j-1], dest [j])> 0; j--) 스왑 (dest, j, j-1); 반품; }비교기의 비교 방법을 호출하십시오
4. 위의 두 분류 성능의 비교
BinarySort는 NLG (N) 비교를 수행해야하며 최악의 경우 N^2 움직임
Mergesort는 지속적으로 이진 분할을 수행하고 있으며 이진 부서가 작은 부품으로 나눈 후 삽입 및 정렬됩니다. 따라서 NLG (N) 시간이 비교되고 NLG (N) 시간이 이동됩니다 . 그러나 먼저 소스 데이터의 사본을 복사해야하므로 공간의 두 배를 차지합니다.
따라서 필요에 따라 선택할 수 있습니다
위의 기사에서는 객체 배열 또는 목록의 순서에 대해 간략하게 설명하며 컬렉션의 정렬 원리는 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.