정렬과 관련된 interface는 Comparable, Comparator 두가지가 있으며
- Comparable은 Collection에 추가되는 데이터 자체에 정렬 기준을 넣고 싶을 때
구현하는 interface이다. 이것을 내부 정렬 기준이라 한다.
Comparable에서는 comapreTo()메서드를 재정의해야한다.
- Comparator는 외부에 별도로 정렬 기준을 구현하고 싶을때 구현하는 interface이다.
이것을 외부 정렬 기준이라 한다.
Comparator에서는 compare()메서드를 재정의 해야 한다.
예시를 보자면
ArrayList<String> list = new ArrayList<String>();
list.add("일지매");
list.add("홍길동");
list.add("성춘향");
list.add("변학도");
list.add("이순신");
System.out.println("정렬전 : " + list);
// 정렬은 Collections.sort() 메서드를 이용하여 정렬한다.
// Collections.sort()메서드는 기본적으로 내부정렬 기준으로 정렬한다.
Collections.sort(list);
System.out.println("정렬후: " + list);
Collections.sort()를 통하여 정렬할 수 있다.
String 자체에 내부정렬 기준이 있는데 오름차순이여서 정렬 후 결과가 이렇게 나온다.
외부 정렬 기준을 구성하는 class를 만들어서 외부정렬을 할 수 있다.
이때 Comparator 인터페이스를 구현하여 작성한다.
compare()메서드를 이용하여 정렬하고자 하는 기준을 정해준다.
compare()메서드의 반환값의 의미(return 값)로는 3가지가 있다.
0일 때 => 두 값이 같다.
양수 일 때 => 앞, 뒤의 순서를 바꾼다.
음수 일 때 => 앞, 뒤의 순서를 바꾸지 않는다.
class Desc implements Comparator<String>{
@Override // 파라미터 값을 통해서 return값을 주면 된다.
public int compare(String str1, String str2) {
// 내림차순으로 구현하려고 한다.
if(str1.compareTo(str2) > 0) {
return -1;
}else if(str1.compareTo(str2) < 0) {
return 1;
}else {
return 0;
}
외부정렬을 기준으로 하여 다시 정렬을 해보자
Collections.sort(list, new Desc());
System.out.println("내림차순 정렬 후: " + list);
Collections.shuffle(list);을 통하여 리스트를 랜덤으로 섞어주고 내림차순으로 정렬해봤다.
추가로 회원번호를 기준으로 오름차순이 정렬되도록 내부정렬 기준을 추가해 보았다.
회원Class를 먼져 추가해준다.
class Member implements Comparable<Member>{
private int num; // 회원 번호
private String name; // 회원 이름
private String tel; // 전화번호
//생성자
public Member(int num, String name, String tel) {
this.num = num;
this.name = name;
this.tel = tel;
}
getter/setter와 toString도 같이 생성한다.
ArrayList<Member> memList = new ArrayList<Member>();
memList.add(new Member(1, "홍길동", "010-1111-1111"));
memList.add(new Member(5, "이순신", "010-2222-1111"));
memList.add(new Member(9, "성춘향", "010-3333-1111"));
memList.add(new Member(3, "강감찬", "010-4444-1111"));
memList.add(new Member(6, "일지매", "010-5555-1111"));
memList.add(new Member(2, "변학도", "010-6666-1111"));
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);
}
후에 Member를 받는 새로운 리스트를 만들어주고 정보를 입력해놓는다.
정렬전에는 입력한 순서대로 나오지만 정렬후에는 회원번호 순으로 나오는 것을 알 수 있다.
고급자바_1222-1 (0) | 2022.12.22 |
---|---|
고급자바_1221-1 (0) | 2022.12.21 |
고급자바_1220-1 (0) | 2022.12.20 |
고급자바 1219-1 (0) | 2022.12.19 |
고급자바(1217-1) (0) | 2022.12.17 |