compare()메서드의 반환값을 결정하는 방법
: 이 메서드가 양수를 반환하면 두 값의 순서가 바뀐다.(오름차순이 기본임)
오름차순 정렬일 경우...
: 앞의 값이 크면 양수, 같으면 0, 앞의 값이 작으면 음수를 반환하도록 한다.
String객체에는 정렬을 위해서 compareTo()메서드가 구현되어 있는데 이 메서드의 반환값은 오름차순에 맞게 반환되도록 구현되어 있다.
(Wrapper클래스와 Date, File클래스에도 구현되어 있다.)
(ex)
class Desc implements Comparator<String>{ //Comparator<String> 을 꼭 implements 해야한다.
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2) * 1; // 기본적으로 오름차순(양수)으로 구현되어 있다
// return str1.compareTo(str2) * -1;// 내림차순 (음수)
}
}
public class T02_ListSortTest {//20.09.14
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("일지매"); //Comparable -> compareTo()구현되어 있음
list.add("홍길동");
list.add("성춘향");
list.add("변학도");
list.add("이순신");
System.out.println("1. 정렬 전 : "+list); // [일지매, 홍길동, 성춘향, 변학도, 이순신]
//정렬은 Collection.sort()메서드를 이용하여 정렬한다.
//기본적으로 '오름차순 정렬'을 수행한다.
//정렬방식을 변경하려면 정렬방식을 결정하는 객체를 만들어서
//Collection.sort()메서드에 변수로 넘겨주면 된다.
Collections.sort(list); // 오름차순으로 정렬하기
System.out.println("2. 정렬 후 :" + list); //[변학도, 성춘향, 이순신, 일지매, 홍길동]
Collections.shuffle(list); // 데이터를 섞어준다.
System.out.println("자료 섞기 후 : "+ list);
//정렬방식을 결정하는 객체(정렬자)를 이용하여 정렬하기
Collections.sort(list, new Desc());
System.out.println("정렬 후 :" + list); // 오름차순
}
}
(ex2)
/**
* 회원의 정보를 저장할 클래스
* (회원이름을 기준으로 오름차순 정렬이 될 수 있는 클래스 만들기)
*/
class Member implements Comparable<Member>{
private int num; // 번호
private String name; //이름
private String te1;
@Override
public String toString() {
return "Member [num=" + num + ", name=" + name + ", te1=" + te1 + "]";
}
/**
* 이름을 기준으로 오름차순 정렬이 되도록 설정한다.
*/
@Override
public int compareTo(Member mem) {
return getName().compareTo(mem.getName());
}
}
/**
* 정렬 기준의 외부 선언을 위해서는 Comparator인터페이스를 구현하면 된다.
* (Member객체의 번호(num)의 내림차순으로 정렬하기)
*/
class SortNumDesc implements Comparator<Member>{ //외부 정렬 기준을 이용한 정렬하기 클래스
@Override
public int compare(Member mem1, Member mem2) {
/*
if(mem1.getNum() > mem2.getNum()) { // 내림차순 -> 음수 리턴;
return -1; // 음수 리턴;
}else if(mem1.getNum() == mem2.getNum()) {
return 0;
}
return 1; // 위가 모두 아닐때 양수 리턴;
}*/
// Wrapper클래스에서 제공하는 메서드를 이용하는 방법1
/*return Integer
* .compare(mem1.getNum(), mem2.getNum()) * -1;
*/
// Wrapper클래스에서 제공하는 메서드를 이용하는 방법2
return new Integer(mem1.getNum())
.compareTo(mem2.getNum()) * -1;
}
}
public class T03_ListSrotTest { // 20200914
public static void main(String[] args) {
List<Member> memList = new ArrayList<Member>();
memList.add(new Member(1, "홍길동", "010-1111-1111"));
memList.add(new Member(5, "변학도", "010-2222-2222"));
memList.add(new Member(9, "성춘향", "010-3333-3333"));
memList.add(new Member(3, "이순신", "010-4444-4444"));
memList.add(new Member(6, "강감찬", "010-5555-5555"));
memList.add(new Member(2, "일지매", "010-6666-6666"));
System.out.println("정렬전 : " );
for(Member mem : memList) {
System.out.println(mem);
}
System.out.println("------------------------------------");
Collections.sort(memList); // 정렬하기
System.out.println("이름의 오름차순으로 정렬 후:");
for(Member mem : memList) {
System.out.println(mem);
}
System.out.println("--------------------------------");
//외부 정렬 기준을 이용한 정렬하기
Collections.sort(memList, new SortNumDesc());
System.out.println("번호의 내림차순으로 정렬 후:");
for(Member mem : memList) {
System.out.println(mem);
}
}
}