Java는 클래스의 데이터 멤버를 사용하여 객체를 정렬하는 두 가지 인터페이스를 제공합니다.
- 유사한
- 비교기
비교 가능한 인터페이스 사용
비교 대상은 자신을 다른 대상과 비교할 수 있습니다. 클래스 자체는 다음을 구현해야 합니다. java.lang.비교 가능 인스턴스를 비교하는 인터페이스입니다.
등급, 이름, 연도와 같은 멤버가 있는 영화 클래스를 생각해 보세요. 개봉 연도를 기준으로 영화 목록을 정렬하고 싶다고 가정해 보겠습니다. Movie 클래스를 사용하여 Comparable 인터페이스를 구현할 수 있으며 Comparable 인터페이스의 CompareTo() 메서드를 재정의합니다.
자바
분수로 0.0625
// A Java program to demonstrate use of Comparable> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable> {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Driver class> class> Main> {> >public> static> void> main(String[] args)> >{> >ArrayList list =>new> ArrayList();> >list.add(>new> Movie(>'Force Awakens'>,>8.3>,>2015>));> >list.add(>new> Movie(>'Star Wars'>,>8.7>,>1977>));> >list.add(>new> Movie(>'Empire Strikes Back'>,>8.8>,>1980>));> >list.add(>new> Movie(>'Return of the Jedi'>,>8.4>,>1983>));> >Collections.sort(list);> >System.out.println(>'Movies after sorting : '>);> >for> (Movie movie: list)> >{> >System.out.println(movie.getName() +>' '> +> >movie.getRating() +>' '> +> >movie.getYear());> >}> >}> }> |
>
C 코드 문자열 배열
>산출
Movies after sorting : Star Wars 8.7 1977 Empire Strikes Back 8.8 1980 Return of the Jedi 8.4 1983 Force Awakens 8.3 2015>
이제 등급과 이름을 기준으로 영화를 정렬한다고 가정해 보겠습니다. 컬렉션 요소를 비교 가능하게 만들 때(Comparable을 구현하여) CompareTo() 메서드를 구현할 수 있는 기회는 단 한 번뿐입니다. 솔루션은 다음을 사용하고 있습니다. 비교기.
비교기 사용
Comparable과 달리 Comparator는 비교하는 요소 유형 외부에 있습니다. 별도의 수업입니다. 서로 다른 멤버를 비교하기 위해 여러 개의 개별 클래스(Comparator를 구현하는)를 만듭니다.
Collections 클래스에는 두 번째 sort() 메서드가 있으며 Comparator를 사용합니다. sort() 메서드는 Compare() 메서드를 호출하여 객체를 정렬합니다.
등급별로 영화를 비교하려면 다음 3가지 작업을 수행해야 합니다.
컴퓨터 네트워크
- Comparator를 구현하는 클래스(및 이전에 CompareTo()에서 수행한 작업을 수행하는 Compare() 메서드)를 만듭니다.
- Comparator 클래스의 인스턴스를 만듭니다.
- 오버로드된 sort() 메서드를 호출하여 Comparator를 구현하는 클래스의 인스턴스와 목록을 모두 제공합니다.
자바
자바로 파일을 여는 방법
// A Java program to demonstrate Comparator interface> import> java.io.*;> import> java.util.*;> // A class 'Movie' that implements Comparable> class> Movie>implements> Comparable {> >private> double> rating;> >private> String name;> >private> int> year;> >// Used to sort movies by year> >public> int> compareTo(Movie m)> >{> >return> this>.year - m.year;> >}> >// Constructor> >public> Movie(String nm,>double> rt,>int> yr)> >{> >this>.name = nm;> >this>.rating = rt;> >this>.year = yr;> >}> >// Getter methods for accessing private data> >public> double> getRating() {>return> rating; }> >public> String getName() {>return> name; }> >public> int> getYear() {>return> year; }> }> // Class to compare Movies by ratings> class> RatingCompare>implements> Comparator {> >public> int> compare(Movie m1, Movie m2)> >{> >if> (m1.getRating() return -1; if (m1.getRating()>m2.getRating()) 1을 반환합니다. 그렇지 않으면 0을 반환합니다. } } // 이름으로 영화를 비교하는 클래스 class NameCompare Implements Comparator { public int Compare(Movie m1, Movie m2) { return m1.getName().compareTo(m2.getName()); } } // 드라이버 클래스 class Main { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(새 영화('깨어난 포스', 8.3, 2015)); list.add(new Movie('스타워즈', 8.7, 1977)); list.add( new Movie('제국의 역습', 8.8, 1980)); list.add( new Movie('제다이의 귀환', 8.4, 1983)); // 평점순으로 정렬 : (1) // ratingCompare 객체 생성 // (2) Collections.sort 호출 // (3) 정렬된 목록 인쇄 System.out.println('Sorted by rating'); RatingCompare ratingCompare = new RatingCompare(); Collections.sort(list, ratingCompare); for (영화 영화 : 목록) System.out.println(movie.getRating() + ' ' + movie.getName() + ' ' + movie.getYear()); // RatingCompare를 사용하여 오버로드된 정렬 메서드 호출 // (위와 세 단계 동일) System.out.println('
Sorted by name'); NameCompare nameCompare = 새로운 NameCompare(); Collections.sort(list, nameCompare); for (영화 영화 : 목록) System.out.println(movie.getName() + ' ' + movie.getRating() + ' ' + movie.getYear()); // 연도별로 정렬하려면 Comparable을 사용합니다. System.out.println('
연도별 정렬'); Collections.sort(list); for (영화 영화 : 목록) System.out.println(movie.getYear() + ' ' + movie.getRating() + ' ' + movie.getName() + ' '); } }> |
>
자바 int를 두 배로 늘리기
>
산출:
Sorted by rating 8.3 Force Awakens 2015 8.4 Return of the Jedi 1983 8.7 Star Wars 1977 8.8 Empire Strikes Back 1980 Sorted by name Empire Strikes Back 8.8 1980 Force Awakens 8.3 2015 Return of the Jedi 8.4 1983 Star Wars 8.7 1977 Sorted by year 1977 8.7 Star Wars 1980 8.8 Empire Strikes Back 1983 8.4 Return of the Jedi 2015 8.3 Force Awakens>
- 비교 가능은 자연스러운 순서를 갖는 객체를 의미합니다. 즉, 객체 자체가 정렬 방법을 알아야 함을 의미합니다. 예를 들어 학생의 롤 번호입니다. 반면 Comparator 인터페이스 정렬은 별도의 클래스를 통해 수행됩니다.
- 논리적으로 Comparable 인터페이스는 이 참조를 지정된 개체와 비교하고 Java의 Comparator는 제공된 두 개의 서로 다른 클래스 개체를 비교합니다.
- 어떤 클래스가 Java에서 Comparable 인터페이스를 구현하는 경우 해당 객체의 컬렉션인 List 또는 Array는 Collections.sort() 또는 Arrays.sort() 메소드를 사용하여 자동으로 정렬될 수 있으며 객체는 CompareTo 메소드에 의해 정의된 자연 순서에 따라 정렬됩니다.
- 기본적인 차별화 기능은 비교 기능을 사용하면 하나의 비교만 사용할 수 있다는 것입니다. 반면, 정렬의 의미에 대한 서로 다른 해석을 사용하여 특정 유형에 대해 원하는 대로 둘 이상의 사용자 정의 비교기를 작성할 수 있습니다. 비교 예에서와 같이 하나의 속성(예: 연도)으로만 정렬할 수 있지만 비교기에서는 등급, 이름, 연도와 같은 다른 속성도 사용할 수 있었습니다.
요약하자면, 객체 정렬이 자연 순서에 따라 이루어져야 한다면 Comparable을 사용하고, 다른 객체의 속성에 따라 정렬이 필요하다면 Java에서 Comparator를 사용하세요.