유사한
분류 인터페이스입니다.
클래스가 비슷한 인터페이스를 구현하면 "이 클래스는 정렬을 지원합니다"를 의미합니다. 비슷한 인터페이스 지원 정렬을 구현하는 클래스이므로 이제 "비슷한 인터페이스를 구현하는 클래스의 목록 목록 (또는 배열)이 있다고 가정하면 목록 목록 (또는 배열)을 collections.sort (또는 artray.sort)별로 정렬 할 수 있습니다.
또한, "비교 가능한 인터페이스를 구현하는 클래스의 객체"는 비교기를 지정하지 않고 "순서 맵 (예 : Treemap)"또는 "순서 세트 (treeset)"의 요소에서 키로 사용할 수 있습니다.
비슷한 인터페이스에는 하나의 기능 만 포함되며 그 정의는 다음과 같습니다.
패키지 java.lang; import java.util.*; public interface 비교 가능 <t> {public int compareto (t o);} 설명 : x.compareto (y)를 통해 "x와 y의 크기를 비교"한다고 가정합니다. "음수"를 반환하면 "x가 y보다 작습니다"를 의미합니다. "0"을 반환하면 "x가 y와 같다"는 것을 의미합니다. "양수"를 반환하면 "x가 y보다 큽니다"를 의미합니다.
비슷한 인터페이스는 일반적이므로 비교할 수있는 객체는 어떤 유형과 비교할 수 있는지 선언합니다. (일반적으로 이것은 객체 자체의 유형이지만 때로는 부모 클래스 일 수도 있습니다.)
공개 인터페이스 비슷한 {public boolean compareto (t 다른); }
따라서 비슷한 인터페이스에는 유형 파라미터 t가 포함되어 있으며, 이는 비교할 수있는 클래스가 비교할 수있는 클래스의 유형입니다. 즉, 문자열과 같이 비교할 수있는 클래스를 정의하는 경우 클래스가 비교를 지원하는 것뿐만 아니라 (일반적으로 자체)와 비교할 수있는 것도 선언해야합니다.
공개 클래스 문자열은 비슷한 {...}를 구현합니다.
이제 Binary Max () 메소드의 구현을 고려해 봅시다. 동일한 유형의 두 매개 변수를 수락하려고합니다. 둘 다 비슷하며 서로 비슷합니다. 다행히도 일반적인 방법과 제한된 유형 매개 변수를 사용하는 경우 이것은 매우 직관적입니다.
public static> t max (t t1, t t2) {if (t1.compareto (t2)> 0) return t1; 그렇지 않으면 T2를 반환합니다. }
이 예에서는 T 형에서 생성되는 일반적인 메소드를 정의하고 유형 확장 (구현)을 비교할 수 있습니다. 두 매개 변수 모두 유형 T이어야합니다. 즉, 동일한 유형이고 지원 비교이며 서로 비슷합니다. 쉬운!
더 나은, 컴파일러는 유형 추론을 사용하여 max ()가 호출 될 때 t 값의 의미를 결정합니다. 따라서 T를 전혀 지정할 필요가 없으며 다음 호출이 작동합니다.
문자열 s = max ( "moo", "bark");
컴파일러는 미리 정해진 t 값이 문자열이므로 컴파일 및 유형 검사를 수행합니다. 그러나 비슷한 구현을 구현하지 않는 클래스 X에 인수와 함께 max ()를 호출하려고하면 컴파일러가이를 허용하지 않습니다.
비교기
비교기는 비교기 인터페이스입니다.
정렬을 지원하지 않는 특정 클래스의 순서를 제어 해야하는 경우 (즉, 비슷한 인터페이스를 구현하지 않습니다). 그런 다음 "이 클래스의 비교기"를 설정하여 정렬 할 수 있습니다. 이 "비교기"는 비교기 인터페이스 만 구현하면됩니다.
즉, "비교기 클래스 구현"을 통해 새로운 비교기를 생성 한 다음 비교기를 통해 클래스를 정렬 할 수 있습니다.
비교기 인터페이스에는 두 가지 함수 만 포함되어 있으며 그 정의는 다음과 같습니다.
패키지 java.util; public 인터페이스 비교기 <t> {int compare (t o1, t o2); 부울 평등 (Object obj);} 설명 :
1. 클래스가 비교기 인터페이스를 구현하려는 경우 : 비교 (t o1, t o2) 함수를 구현해야하지만 평등 (Object OBJ) 함수를 구현하지 않을 수 있습니다.
왜 우리는 평등 (Object OBJ) 함수를 구현할 수 없습니까? 기본적으로 Equals (Object OBJ)가 구현되었습니다. Java의 모든 클래스는 java.lang.object에서 상속되며 Equals (Object OBJ) 함수는 Object.java에서 구현됩니다. 따라서 다른 모든 클래스는이 기능을 구현하는 것과 같습니다.
2. Int Compar (t o1, t o2)는 "O1과 O2의 크기 비교"입니다. "음수"을 반환한다는 것은 "O1이 O2보다 작다"는 것을 의미합니다. "Zero"를 반환, "O1은 O2와 같다"는 것을 의미합니다. "양수"를 반환한다는 것은 "O1이 O2보다 큽니다"를 의미합니다.
비교기 및 비교
비교할 수있는 정렬 인터페이스입니다. 클래스가 비슷한 인터페이스를 구현하면 "이 클래스는 정렬을 지원합니다"를 의미합니다.
비교기는 비교기입니다. 특정 클래스의 순서를 제어 해야하는 경우,이 클래스의 비교기를 설정하여 정렬 할 수 있습니다.
비교가 "내부 비교기"와 동일하다는 것을 찾는 것은 어렵지 않지만 비교기는 "외부 비교기"와 동일하다.
우리는이 두 인터페이스를 설명하기 위해 테스트 프로그램을 사용합니다. 소스 코드는 다음과 같습니다.
import java.util.*; import java.lang.comparable;/*** @desc 비교 프로그램 "비교기"와 "비교 가능". * (01) "비교 가능" * 하나의 함수 비교 () 만 포함하는 정렬 인터페이스입니다. * 클래스는 비슷한 인터페이스를 구현하는데, 이는 "클래스 자체가 정렬을 지원하는"것을 의미하며, 이는 배열을 통해 직접 정렬 할 수 있습니다. * (02) "비교기" * 두 가지 함수를 포함하여 비교기 인터페이스입니다. 비교 ()와 equals (). * 클래스는 비교기 인터페이스를 구현 한 다음 "비교기"입니다. 다른 클래스는 비교기에 따라 정렬 할 수 있습니다. * * 요약 : 비교할 수있는 것은 내부 비교기이며, 비교기는 외부 비교기입니다. * 클래스 자체는 비교 가능한 비교기를 구현하므로 정렬을 지원한다는 것을 의미합니다. 비교 가능한 자체를 구현하지 않으면 외부 비교기 비교기를 통해 정렬 할 수도 있습니다. */public class compareComparatorand ComparableTest {public static void main (String [] args) {// 새 배열리스트 (동적 배열) ArrayList <Person> 목록 = new ArrayList <Person> (); // ArrayList List.Add에 객체를 추가합니다 (새 사람 ( "CCC", 20)); list.add (새 사람 ( "aaa", 30)); list.add (신규 사람 ( "bbb", 10)); list.add (신규 사람 ( "ddd", 40)); // 목록 System.out.printf의 원본 시퀀스를 인쇄합니다. // 목록을 정렬하십시오. // 여기에서는 "사람이 구현 한 비교 가능한 <string> 인터페이스", 즉 "이름", collections.sort (list)에 따라 정렬됩니다. System.out.printf ( "이름 정렬, 목록 :%s/n", 목록); // "비교 (AscageComparator)"를 통해 목록을 정렬합니다. // ascagecomparator의 정렬 방법은 다음과 같습니다. System.out.printf ( "ASC (AGE) 정렬, 목록 :%S/N", LIST); // "비교 (descagecomparator)"를 통해 목록을 정렬합니다. // descagecomparator의 정렬 방법은 다음과 같습니다. "age"collections.sort의 내림차순 순서에 따라 정렬 (list, new descagecomparator ()); System.out.printf ( "Desc (Age) 정렬, 목록 :%s/n", 목록); // 두 사람이 동등한 testequals인지 여부를 결정합니다 (); } /*** @desc 두 사람이 평등한지 테스트합니다. * 사람은 평등 () 기능을 구현하기 때문에 : 두 사람의 나이와 이름이 동일하면 두 사람은 평등 한 것으로 간주됩니다. * 따라서 P1과 P2는 동일합니다. * * todo : equals () 함수가 직접 제거되면 p1은 p2 */ private static void testequals () {person p1 = new Person ( "eee", 100); Person P2 = 새로운 사람 ( "eee", 100); if (p1.equals (p2)) {system.out.printf ( " %s Equal %s/n", p1, p2); } else {System.out.printf ( " %s 동일하지 않은 %s/n", p1, p2); }} /*** @desc 개인 클래스. * 사람은 비슷한 인터페이스를 구현합니다. 즉, 사람 자체가 정렬을 지원한다는 것을 의미합니다.*/ 개인 정적 계급 사람은 비슷한 <person> {int age; 문자열 이름; 공개 사람 (문자열 이름, int age) {this.name = 이름; this.age = age; } public String getName () {return name; } public int getage () {반환 연령; } public String toString () {return name + " -" + age; } / *** 두 사람이 평등한지 여부를 비교하십시오. 이름과 나이가 같으면 동등한 것으로 간주됩니다* / boolean Equals (사람) {if (this.age == person.age && this.name == person.name)는 true; 거짓을 반환합니다. } /*** @desc "비교 <문자열>"의 인터페이스를 구현합니다. 즉, 비교 <t t> 함수를 다시 작성하십시오. * 여기에 "사람의 이름"*/ @override public int compareto (person person) {return name.compareto (person.name); // reture this.name -person.name; }} / *** @desc ascagecomparator 비교기* "사람의 나이를 올라가는 비교기"* / 개인 정적 클래스 AscageComparator Implements Implements Comporator <person> {@override public int comport (person p1, person p2) {return p1.getage () - p2.getage (); }} / *** @desc descagecomparator 비교기* "사람의 나이를 올라가는 비교기"* / 개인 정적 클래스 DescageComparator Implements Implesments Comporator <person> {@override public int comport (person p1, person p2) {return p2.getage () - p1.getage (); }}} 다음은이 프로그램에 대한 설명입니다.
1. 직원 수업 정의. 다음과 같이 :
개인 정적 계급 사람은 비슷한 <person> {int age; 문자열 이름; ... /*** @desc는 "비교 <문자열>"의 인터페이스를 구현합니다. 즉, 비교 <t t> 함수를 무시합니다. * 여기에 "사람의 이름"*/ @override public int compareto (person person) {return name.compareto (person.name); // reture this.name -person.name; }} 설명 :
(1) 개인 수업은 사람을 나타냅니다. Persong 클래스에는 두 가지 속성이 있습니다 : 연령 (연령)과 이름 "사람 이름"이 있습니다.
(2) 개인 클래스는 비슷한 인터페이스를 구현하므로 정렬 할 수 있습니다.
2. main ()에서는 사람의 목록 배열 (목록)을 만듭니다. 다음과 같이 :
// 새 ArrayList (Dynamic Array) arraylist <person> list = new ArrayList <person> (); // ArrayList List.Add (new Person ( "CCC", 20)); List.Add ( "AAA", 30)); List.Add ( "BBB", 40); ");
3. 다음으로, 우리는 목록의 모든 요소를 인쇄합니다. 다음과 같이 :
// List System.out.printf의 원래 시퀀스를 인쇄합니다 ( "원본 정렬, 목록 :%s/n", list);
4. 그런 다음 컬렉션의 정렬 () 함수를 통해 목록을 정렬합니다.
사람은 비슷한 인터페이스를 구현하기 때문에 정렬 ()을 정렬 할 때 사람이 지원하는 정렬 방법, 즉 비교 (개인)에 의해 정의 된 규칙에 따라 정렬됩니다. 다음과 같이 :
// 목록을 정렬하십시오. // 여기서 우리는 "사람이 구현 한 비교 가능한 <string> 인터페이스", 즉 "name"collections.sort (list)에 따라 정렬합니다. System.out.printf ( "이름 정렬, 목록 :%s/n", 목록);
5. 비교 및 비교기
우리는 두 개의 비교기, Ascagecomparator 및 descagecomparator를 각각 상승하고 낮은 주문 사람을 정의합니다.
6. ASCAGECOMPARATOR 비교기 연령별로 오름차순으로 사람을 분류합니다. 코드는 다음과 같습니다.
/*** @desc ascagecomparator 비교기* 그것은 "사람의 나이를 올라가는 비교기"*/개인 정적 클래스 AscageComparator Implements Impless Comparator <person> {@override public int comport (person p1, person p2) {return p1.getage () - p2.getage (); }} 7. Descagecomparator 비교기 그것은 나이에 따라 내림차순으로 사람을 정렬합니다. 코드는 다음과 같습니다.
/*** @desc descagecomparator 비교기* 그것은 "사람의 나이를 올라가는 비교기"*/개인 정적 클래스 descagecomparator empless emplements <person> {@override public int comport (person p1, person p2) {return p2.getage () - p1.getage (); }} 8. 결과적으로 프로그램을 실행하면 출력은 다음과 같습니다.
원래 정렬, 목록 : [CCC -20, AAA -30, BBB -10, DDD -40] 이름 정렬, 목록 : [AAA -30, BBB -10, CCC -20, DDD -40] ASC (AGE) 정렬, 목록 : [BBB -10, CCC -20, AAA -30, DDD -40] DESC (List, List : [DDD -40) CCC -20, BBB -10] EEE -100 동등한 EEE -100