본문 바로가기

알고리즘

리스트 정렬하기

 - 자바는 정렬을 돕기 위해 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