- 자바는 정렬을 돕기 위해 Comparable과 Comparator라는 두 가지 인터페이스를 제공 Comparable과 Comparator 인터페이스 차이는 무었인가?
- 두 인터페이스 모두 public으로 접근 변경자로 선언하기 때문에 모든 용도의 자료를 담을 수 있다.
- Comparable 인터페이스는 자연스러운 순서로 정렬할 때 사용하고, Comparator는 원하는 대로 정렬 순서를 지정하고
싶은 곳에 사용Comparable Interface
- 객체들 사이의 오름차순, 내림차순 등 일반적인 순서를 결정할 때 사용
- CompareTo 메소드가 있음
Prameter | Comparable | Comparator |
Sorting logic | 소팅 로직은 어떤 오브젝트를 정렬하려면 같은 클래스에 있어야 한다. 이런 이유로 네츄럴한 오브젝트의 오더링이라고 불려진다. | 소팅 로직은 클래스가 분리되어있다. 따라서 우리는 정렬할 개체의 다른 속성에 따라 다른 정렬을 쓸 수 있다. |
Implementation | 클래스의 객체들은 인터페이스를 구현해야 정렬할 수 있습니다. | 클래스의 객체들은 각각의 다른 클래스에 Comparator 인터페이스를 구현해야 정렬할 수 있습니다. |
Soting method | int compareTo(Object o1) 이 메소드는 클래스 내부의 오브젝트와 o1 오브젝트를 비교하여 인티저 형으로 리턴한다. 이 값은 다음과 같은 의미를 가진다. 1.양수 - 클래스 내부의 오브젝트가 o1보다 큰 경우 2. 제로 - 클래스 내부의 오브젝트가 o1과 같을 경우 3. 음수 - 클래스 내부의 오브젝트가 o1보다 작은 경우 | int compare(Object o1,Object o2) 이 메소드는 o1과 o1를 비교한다. 그리고 인티저 형으로 반환한다. 이 값은 다음과 같은 의미를 가진다.1. 양수 = o1이 02보다 작은경우 2. 제로 = o1이 o2와 같은경우 3. 음수 = o1이 o2보다 큰 경우 |
Calling method | Collections.sort(List) 이 오브젝트는 CompareTo method에 의해 기본적인 정렬이 될것이다. | Collections.sort(List, Comparator) 이 오브젝트는 Comparator의 Compare 메소드에 의해 기본적이 정렬이 될것이다. |
Package | java.lang.Comparable | java.util.Comparator |
Comparable
public class Country implements Comparable<Country> {
private int countryId;
private String countryName;public Country(int countryId, String countryName) {
super();
this.countryId = countryId;
this.countryName = countryName;
}
@Override
public int compareTo(Country country) {
return (this.countryId < country.countryId) ? -1 : (this.countryId > country.countryId) ? 1 : 0;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public int getCountryId() {
return countryId;
}
public void setCountryId(int countryId) {
this.countryId = countryId;
}
}
public class ComparableMain {
public static void main(String[] args) {
Country indiaCountry = new Country(1, "India");
Country chinaCountry = new Country(4, "China");
Country nepalCountry = new Country(3, "Nepal");
Country bhutanCountry = new Country(2, "Bhutan");
List<Country> listOfCountries = new ArrayList<Country>();
listOfCountries.add(indiaCountry);
listOfCountries.add(chinaCountry);
listOfCountries.add(nepalCountry);
listOfCountries.add(bhutanCountry);
System.out.println("Before SOrt : ");
for (Country country : listOfCountries) {
System.out.println("Country id : " + country.getCountryId() + "||" + "Country name : " + country.getCountryName());
}
Collections.sort(listOfCountries);
System.out.println("After Sort : ");
for (Country country : listOfCountries) {
System.out.println("Country id : " + country.getCountryId() + "||" + "Country name : " + country.getCountryName());
}
}
}
Result
Comparator
public class Country {
private int countryId;
private String countryName;
public Country(int countryId, String countryName) {
super();
this.countryId = countryId;
this.countryName = countryName;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public int getCountryId() {
return countryId;
}
public void setCountryId(int countryId) {
this.countryId = countryId;
}
}
public class CountrySortByIdComparator implements Comparator<Country> {
@Override
public int compare(Country country1, Country country2) {
return country1.getCountryId() < country2.getCountryId() ? -1 : country1.getCountryId() > country2.getCountryId() ? 1 : 0;
}
public class ComparatorMain {
public static void main(String[] args) {
Country indiaCountry = new Country(1, "India");
Country chinaCountry = new Country(4, "China");
Country nepalCountry = new Country(3, "Nepal");
Country bhutanCountry = new Country(2, "Bhutan");
List<Country> listOfCountries = new ArrayList<Country>();
listOfCountries.add(indiaCountry);
listOfCountries.add(chinaCountry);
listOfCountries.add(nepalCountry);
listOfCountries.add(bhutanCountry);
System.out.println("Before SOrt : ");
for (Country country : listOfCountries) {
System.out.println("Country id : " + country.getCountryId() + "||" + "Country name : " + country.getCountryName());
}
Collections.sort(listOfCountries, new CountrySortByIdComparator());
System.out.println("After Sort By Id: ");
for (Country country : listOfCountries) {
System.out.println("Country id : " + country.getCountryId() + "||" + "Country name : " + country.getCountryName());
}
Collections.sort(listOfCountries, new Comparator<Country>() {
@Override
public int compare(Country o1, Country o2) {
return o1.getCountryName().compareTo(o2.getCountryName());
}
});
System.out.println("After sort By Name: ");
for (Country country : listOfCountries) {
System.out.println("Country id : " + country.getCountryId() + "||" + "Country name : " + country.getCountryName());
}
}
Reuslt
참고 사이트
- http://www.nextree.co.kr/p11101/
- http://www.java2blog.com/2013/02/difference-between-comparator-and.html
참고서적
- JAVA 프로그래밍 면접 이렇게 준비한다 - 저 노엘 마크엄, 역 정원천
'알고리즘' 카테고리의 다른 글
퀵 정렬 알고리즘 (0) | 2017.11.15 |
---|---|
삽입 정렬 알고리즘 (0) | 2017.11.15 |
버블정렬 알고리즘 (0) | 2017.11.15 |
빅 오 표현법 살표보기 (0) | 2017.11.15 |
수열의 결과값을 구하는 프로그램 (0) | 2017.06.30 |