comparable comparator interfaces java
이 튜토리얼은 Java에서 Comparable and Comparator Interfaces의 개념을 예제와 함께 설명합니다. 두 가지의 차이점에 대해서도 배우게됩니다.
이전 튜토리얼에서 인터페이스에 대해 모두 배웠습니다. 인터페이스는 추상 메서드와 정적 또는 최종 변수를 선언하는 데 사용됩니다. 기본적으로 인터페이스 메서드는 공용입니다. Java 8부터 인터페이스에는 정적 및 기본 메서드가 정의되어있을 수도 있습니다.
Java는 다양한 작업을 수행하는 데 사용할 수있는 다양한 내장 인터페이스를 제공합니다. 이 튜토리얼에서는 이러한 두 가지 인터페이스 즉, Comparable과 Comparator에 대해 설명합니다. 자연 순서에 따라 객체를 정렬하기 위해 유사한 인터페이스가 사용됩니다. Comparator 인터페이스는 다양한 개체의 개별 속성을 정렬하는 데 사용됩니다.
=> 여기에서 간단한 Java 교육 시리즈를 살펴보십시오.
Comparable 인터페이스부터 시작하겠습니다.
학습 내용 :
자바에서 비슷한 인터페이스
Comparable 인터페이스는 사용자 지정 개체를 포함하는 Array 및 ArrayLists와 같은 목록 구조를 정렬합니다. 목록 객체가 Comparable 인터페이스를 구현하면 배열의 경우 Collections.sort () 메서드 또는 Arrays.sort ()를 사용하여 내용을 정렬 할 수 있습니다.
그러나 사용자 정의 클래스가 있고 해당 객체를 정렬해야하는 경우이 클래스에서 Comparable 인터페이스를 구현해야합니다. Comparable 인터페이스는 java.lang 꾸러미. 이 인터페이스에는 CompareTo () 메서드가 하나만 있습니다. 비교 가능한 인터페이스를 사용하여 한 번에 하나의 데이터 멤버를 정렬 할 수 있습니다.
예를 들면 클래스의 필드로 이름과 나이가 있으면 한 번에 이름 또는 나이에 따라 클래스 개체를 정렬 할 수 있습니다. 이름과 나이를 동시에 분류 할 수는 없습니다.
위에서 설명한 것처럼 Comparable 인터페이스를 구현하는 사용자 정의 클래스를 사용하여 Java에서 Comparable 인터페이스를 구현할 수 있습니다. Comparable 인터페이스에는 사용자 지정 개체를 정렬하기 위해 클래스에서 재정의해야하는 'compareTo'메서드가 하나만 있습니다.
'CompareTo'방법
Comparable 인터페이스의 'compareTo'메소드는 현재 개체를 지정된 개체와 비교하는 데 사용됩니다. compareTo 객체의 일반적인 구문은 다음과 같습니다.
public int compareTo (Object obj)
위에 표시된대로 compareTo 메서드는 개체를 인수로 받아들이고 (사용자 지정 개체 일 수 있음)이 메서드를 호출하는 데 사용 된 현재 개체와 비교합니다.
compareTo 메서드는 다음 값 중 하나를 가질 수있는 정수 값을 반환합니다.
- 양수 (> 0) 정수 => 현재 개체> 전달 된 개체 매개 변수.
- 부정 (현재 개체
- 0 (= 0) => 현재 개체와 지정된 개체가 모두 같습니다.
compareTo () 메서드를 사용하여 정렬 할 수 있습니다.
- 문자열 유형 객체
- 래퍼 클래스 개체
- 사용자 정의 또는 사용자 정의 개체
이제 Comparable 인터페이스의 예를 구현해 보겠습니다.
유사한 인터페이스 예
다음 Java 프로그램은 이름과 나이를 멤버 필드로 포함하는 Person 클래스를 구현합니다. 이 클래스는 Person 클래스의 객체를 정렬 할 수있는 'Comparable'인터페이스를 구현합니다.
사용자 지정 개체를 정렬 할 때 Comparable 인터페이스의 'compareTo ()'메서드를 재정의해야합니다.
기능 테스트와 비 기능 테스트
재정의 된 compareTo () 메서드 내에서 전달 된 사람 개체의 나이를 현재 개체의 나이와 비교하여 그에 따라 값을 반환합니다.
Java 프로그램의 예가 아래에 나와 있습니다.
//class person implementing Comparable interface class Person implements Comparable { private String name; private int age; //Person constructor public Person(String name, int age) { this.name = name; this.age = age; } //getter methods for Person members public int getAge() { return this.age; } public String getName() { return this.name; } //override toString () method @Override public String toString() { return ''; } //Override compareTo () method to compare age of two Person objects @Override public int compareTo(Person per) { if(this.age == per.age) return 0; else return this.age > per.age ? 1 : -1; } } public class Main{ public static void main(String() args) { //declare two objects of Person class Person p1 = new Person('Adrian', 24); Person p2 = new Person('Eddie', 26); int ageDiff = p1.compareTo(p2); //compare ages of two persons declared switch(ageDiff) { case -1: { System.out.println(p2.getName() + ' is older than ' + p1.getName()); break; } case 1: { System.out.println(p1.getName() + ' is older than ' + p2.getName()); break; } default: System.out.println(p1.getName () + ' and ' + p2.getName () + ' are of the same age!'); } } }
산출:
출력에서 볼 수 있듯이 Comparable 인터페이스를 사용하여 연령 멤버 변수를 기반으로 Person 클래스의 두 개체를 비교합니다.
이름에서 알 수 있듯이 Comparable 인터페이스를 사용하면 개체가 동일한 유형 인 경우 한 개체를 다른 개체와 비교할 수 있습니다. 객체가 스스로 배열하는 것을 알고있는 한,이 인터페이스에 속한 유일한 방법 인 'compareTo ()'를 사용하여 객체를 쉽게 정렬 할 수 있습니다.
Java String CompareTo () 메서드
또한 compareTo () 메서드를 사용하여 Java에서 두 개의 String 유형 객체를 비교할 수 있습니다. 두 문자열 객체는 문자열 객체의 각 문자를 동등한 유니 코드 문자로 변환하여 사전 식으로 비교됩니다.
두 문자열이 같으면 0이 반환됩니다. 첫 번째 개체가 두 번째 개체보다 크면 양수 값이 반환되고 첫 번째 문자열 개체가 두 번째 String 개체보다 작 으면 음수 값이 반환됩니다.
예를 들어,
string1.compareTo (string2)는 string1과 string 2를 사전 식으로 비교합니다.
public class Main { public static void main(String args()) { //declare and print string objects String str1 = 'SoftwareTestingHelp'; String str2 = 'Java Series tutorial'; String str3 = 'Comparable Interface'; System.out.println('str1:' + str1); System.out.println('str2:' + str2); System.out.println('str3:' + str3); //compare strings and print the results. int retval1 = str1.compareTo( str2 ); System.out.println('
str1 & str2 comparison: '+retval1); int retval2 = str1.compareTo( str3 ); System.out.println('str1 & str3 comparison: '+retval2); int retval3 = str2.compareTo('compareTo method'); System.out.println('str2 & string argument comparison: '+retval3); } }
산출:
위 프로그램에서 compareTo () 메서드를 사용하여 두 문자열을 비교하는 방법을 보았습니다. 그 전에는 compareTo () 메서드를 사용하여 정수 값 (예 : 나이)을 비교했습니다. 비슷하게, 우리는 compareTo () 메소드와 함께 double과 같은 다른 데이터 유형을 사용할 수 있습니다.
이제 Java의 Comparator 인터페이스로 이동하겠습니다.
자바의 비교기 인터페이스
우리는 이미 Comparable 인터페이스의 작동을 보았습니다. 비교 가능한 인터페이스를 통해 단일 데이터 멤버를 기반으로 사용자 지정 개체를 정렬 할 수 있습니다. 그러나 여러 필드 또는 데이터 멤버를 기반으로 개체를 정렬해야하는 경우 Comparator 인터페이스를 선택할 수 있습니다.
Comparator 인터페이스를 사용하면 사용자 정의 개체를 정렬하는 데 사용할 필드 수에 따라 둘 이상의 비교기를 만들 수 있습니다. 비교기 인터페이스를 사용하여 두 개의 멤버 필드 이름과 연령에 대해 사용자 정의 개체를 정렬한다고 가정하면 이름과 연령에 대해 하나씩 두 개의 비교기가 필요합니다.
그런 다음 이러한 Comparators를 사용하여 Collections.sort () 메서드를 호출 할 수 있습니다.
그렇다면 비교기를 어떻게 정확하게 작성할 수 있습니까?
필드로 이름과 나이가있는 학급 학생의 예를 고려하십시오. 이름 및 연령 필드에서 Student 개체를 정렬하려는 경우를 고려하십시오.
이를 위해 먼저 Comparator 클래스, StudentAgeComparator 및 StudenNameComparator를 작성해야합니다. 이 클래스에서 Comparator 인터페이스의 compare () 메서드를 재정의 한 다음 이러한 각 비교기를 사용하여 Collections.sort 메서드를 호출하여 학생 개체를 정렬합니다.
비교기 인터페이스에는 서로 다른 두 클래스의 개체를 비교하는 데 사용되는 '비교'개체가 포함되어 있습니다. 비교 방법의 일반적인 구문은 다음과 같습니다.
public int compare (Object obj1, Object obj2);
compare 메서드는 obj1과 obj2를 비교합니다.
Comparator 인터페이스는 java.util 패키지 및 비교 방법과는 별도로; equals라는 또 다른 메소드도 포함되어 있습니다.
자바 비교기 예
Java로 Comparator 예제를 구현해 보겠습니다. 다시 우리는 데이터 멤버로 이름과 나이를 가진 Student 클래스를 가져 왔습니다. 그런 다음 비교 메서드를 재정 의하여 두 학생의 나이를 비교하고 적절한 값을 반환하는 비교기 클래스 AgeComparator를 정의합니다.
주요 방법에서는 Student 개체의 Arraylist를 구성합니다. 그런 다음 ArrayList 및 AgeComparator 개체를 인수로 사용하여 Collections.sort 메서드를 호출합니다. 이것은 나이에 따라 Student 개체를 정렬합니다.
이 시나리오를 구현하는 Java 프로그램은 다음과 같습니다.
import java.util.*; //class student whose objects are to be sorted class Student{ int rollno; String name; int age; Student(int rollno,String name,int age){ this.rollno=rollno; this.name=name; this.age=age; } } //AgeComparator class implementing Comparator to compare objects class AgeComparator implements Comparator { public int compare(Object o1,Object o2){ Student s1=(Student)o1; Student s2=(Student)o2; if(s1.age==s2.age) return 0; else if(s1.age>s2.age) return 1; else return -1; } } class Main{ public static void main(String args()){ //create an ArrayList of Students ArrayList myList=new ArrayList(); myList.add(new Student(101,'Adrian',25)); myList.add(new Student(106,'Sydney',22)); myList.add(new Student(105,'Marcus',27)); //call Collections.sort method with AgeComparator object to sort ArrayList Collections.sort(myList,new AgeComparator()); System.out.println('Sorted Student objects by Age are as follows:'); Iterator iter= myList.iterator(); while(iter.hasNext()){ Student st=(Student) iter.next(); System.out.println(st.rollno+' '+st.name+' '+st.age); } } }
산출:
위의 프로그램에서 AgeComparator를 작성하여 Age를 기준으로 Student 개체를 정렬하는 방식과 유사하게 이름 필드를 기준으로 Student 개체를 정렬하는 또 다른 NameComparator를 작성할 수도 있습니다.
이렇게하면 다양한 필드에서 개체를 정렬하는 데 필요한만큼의 Comparator 클래스를 가질 수 있습니다. 두 개의 int 변수를 비교하는 방식으로, Compare 메서드를 사용하여 다른 데이터 유형의 변수를 비교할 수도 있습니다.
비교 가능한 대 비교기의 차이점
비슷한 인터페이스 | 비교기 인터페이스 |
---|---|
Collections.sort (List)를 사용하여 요소를 정렬합니다. | Collections.sort (List, Comparator)를 사용하여 요소를 정렬합니다. |
비교 가능한 인터페이스는 단일 필드 정렬을 제공합니다. | 비교기 인터페이스는 여러 필드 정렬을 제공합니다. |
비교 가능한 인터페이스는 자연스러운 순서에 따라 개체를 정렬합니다. | 비교기 인터페이스는 다양한 개체의 다양한 속성을 정렬합니다. |
비교 가능한 인터페이스를 사용하여 현재 개체 'this'를 지정된 개체와 비교할 수 있습니다. | 비교기 인터페이스를 사용하여 서로 다른 클래스의 객체를 비교할 수 있습니다. |
java.lang 패키지의 일부입니다. | java.util 패키지의 일부입니다. |
Comparable 인터페이스를 사용하면 실제 클래스가 수정됩니다. | 비교기는 원래 클래스를 변경하지 않습니다. |
요소를 정렬하는 compareTo () 메서드를 제공합니다. | 요소를 정렬하기위한 compare () 메서드를 제공합니다. |
자주 묻는 질문
Q # 1) 기능적인 인터페이스가 비슷합니까?
대답: 예, 비교 가능한 기능적인 인터페이스입니다. 단일 추상 메서드 인 compareTo ()를 선언합니다.
Q # 2) 클래스를 비교 가능하게 만드는 방법은 무엇입니까?
대답: Comparable 인터페이스를 구현하여 비슷한 클래스를 만듭니다. 클래스 내에서 compareTo () 메서드를 재정 의하여 개체를 정렬합니다. 객체를 전달하고 현재 객체와 비교합니다.
두 객체가 같으면 compareTo () 메서드는 0을 반환합니다. 첫 번째 개체가 두 번째 개체보다 작 으면 음수를 반환하고 첫 번째 개체가 두 번째 개체보다 크면 양수를 반환합니다.
Q # 3) Comparator 인터페이스의 주요 목적은 무엇입니까?
대답: 비교기 인터페이스는 주로 사용자 지정 개체를 정렬하는 데 사용됩니다. 비교기 인터페이스를 사용하여 서로 다른 클래스의 객체를 비교할 수도 있습니다. 또한 비교기 인터페이스를 사용하여 여러 필드의 개체를 정렬 할 수 있습니다.
Q # 4) Java에서 Comparator가 사용되는 이유는 무엇입니까?
대답: Comparator 인터페이스는 주로 여러 필드를 기반으로 한 자연 순서 이외의 사용자 지정 개체에 대해 다른 정렬 순서를 원할 때 사용됩니다.
Q # 5) Comparable 인터페이스를 구현하는 것은 무엇입니까?
대답: 유사한 인터페이스는 모든 래퍼 클래스와 String 클래스에 의해 구현됩니다. 사용자 지정 개체는 정렬을 위해 유사한 인터페이스를 사용합니다.
결론
이 튜토리얼에서 우리는 자바의 비교 가능한 인터페이스에 대해 논의했습니다. 비교 가능한 인터페이스는 자연스러운 순서에 따라 개체를 정렬하는 데 사용되며 한 번에 하나의 필드에서만 개체를 정렬 할 수 있습니다.
비교 가능한 인터페이스에는 Comparator 인터페이스를 구현하는 클래스에서 재정의해야하고 개체를 정렬 할 'compareTo ()'메서드가 있습니다.
Comparator 인터페이스는 다른 순서에 따라 정렬 할 사용자 지정 개체를 정렬하는 데 사용됩니다. 비교기 인터페이스를 사용하면 여러 필드를 기반으로 두 개의 서로 다른 클래스의 개체를 정렬 할 수도 있습니다.
추천 도서
- 예제가 포함 된 Java 인터페이스 및 추상 클래스 자습서
- Java에서 인터페이스 설정 : 예제가 포함 된 Java 세트 자습서
- Java 배포 : Java JAR 파일 생성 및 실행
- Java 기초 : Java 구문, Java 클래스 및 핵심 Java 개념
- Java Virtual Machine : JVM이 Java 응용 프로그램을 실행하는 데 도움이되는 방법
- 예제가있는 Java의 ListIterator 인터페이스
- Java에서 객체 배열 : 생성, 초기화 및 사용 방법
- 초보자를위한 JAVA 튜토리얼 : 100 개 이상의 실습 Java 비디오 튜토리얼