romworld

정렬(Comparable, Comparator) 본문

JAVA/개념정리

정렬(Comparable, Comparator)

inderrom 2022. 10. 28. 01:34
package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/*
 * - 정렬과 관련된 interface는 Comparable, Comparator 이렇게 두 가지가 있다.
 * 
 * - Comparable은 Collection에 추가되는 데이터 자체에 정렬 기준을 넣고 싶을 때 구현하는 인터페이스다.
 * 		(즉, 내부 정렬 기준을 구현할 때 사용한다.)
 * - Comparator는 외부에 별도로 정렬 기준을 구현하고 싶을 때 구현하는 인터페이스이다.
 * 		(즉, 외부 정렬 기준을 구현할 때 사용한다.)
 * 
 * - Comparable에서는 compareTo()메서드를 재정의 해야 하고
 * 	 Comparator에서는 compare()메서드를 재정의 해야 한다.
 * 
 * - String클래스, Wrapper 클래스, Date클래스, File클래스등에는 내부 정렬 기준이 이미 구현되어 있다.
 * 	(이 클래스들의 내부 정렬 기준은 오름차순으로 처리 되도록 구현되어 있다.) 
 * 
 * */

public class ListSortTest01 {

	public static void main(String[] args) {
		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.shuffle(list); // 자료를 섞어준다.
		System.out.println("자료 섞기 후 :" + list);

		// 외부 정렬 기준을 적용해서 정렬하기
		Collections.sort(list, new Desc());

		System.out.println("내림차순 정렬 후 : " + list);

	}
}

// 정렬 방식을 정해주는 class를 만든다.(외부 정렬 기준 클래스라고 한다.)
//		=> Comparator인터페이스를 구현해서 작성한다.
class Desc implements Comparator<String>{
	
	// compare()메서드를 이용해서 정렬하고자 하는 기준을 정해준다.
	
	// compare()메서드의 반환값의 의미 및 역할
	// 1. 반환값이 0이면  두 값이 같다.
	// 2. 반환값이 '양수'이면 앞, 뒤의 순서를 바꾼다.
	// 3. 반환값이 '음수'이면 앞, 뒤의 순서를 바꾸지 않는다.
	
	// 예) 오름차순일 경우 
	//	==> 앞의 값이 크면 양수, 같으면 0, 앞의 값이 작으면 음수를 반환하도록 구현하면 된다.
	
	@Override
	public int compare(String str1, String str2) {
		// 내림차순 정렬하기...
		/*
		if(str1.compareTo(str2) > 0) { 
			return -1; 
		}else if(str1.compareTo(str2)<0) {
			return 1;
		}
		*/
		return str1.compareTo(str2) * -1;  // 간단하게 이렇게! 써도 됨 양수이면 -1 곱해져서 음수니까 순서가 바뀌지 않고 음수이면 -1 곱해져서 양수..
		
	}
}
package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class ListSortTest02 {

	public static void main(String[] args) {
		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.toString());
		}
		System.out.println("---------------------------------------------");

		Collections.sort(memList); // 스트링이 아니라 객체일 경우 내부 정렬기준을 따로 정해주지 않으면 오류가남
									// member 생성자 안에 num,name,tel이 있어서 정렬기준이 뭔지 정해줘야함

		System.out.println("회원이름을 기준으로 오름차순 정렬 후....");
		for (Member mem : memList) {
			System.out.println(mem);
		}
		System.out.println("---------------------------------------------");

		// 회원번호의 내림차순으로 정렬하는 외부 정렬 기준 클래스를 이용하여 정렬하시오
		// 클래스명 : SortNumDesc
		Collections.sort(memList, new SortNumDesc());

		System.out.println("회원번호 기준으로 내림차순 정렬 후....");
		for (Member mem : memList) {
			System.out.println(mem);
		}
		System.out.println("---------------------------------------------");

	}
}

// 회원관리를 위한 Member 클래스 작성하기
// ==> 회원이름을 기준으로 오름차순이 되도록 내부 정렬 기준을 지정하기 
// ==> Comparable인터페이스를 구현한다.
class Member implements Comparable<Member> {
	private int num; // 회원번호
	private String name; // 회원이름
	private String tel; // 전화번호

	public Member(int num, String name, String tel) {
		super();
		this.num = num;
		this.name = name;
		this.tel = tel;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	@Override
	public String toString() {
		return "Member [num=" + num + ", name=" + name + ", tel=" + tel + "]";
	}

	// ==> 회원이름을 기준으로 오름차순이 되도록 내부 정렬 기준을 지정하기
	@Override
	public int compareTo(Member mem) { // this(나자신)하고 매개변수를 비교
		return this.getName().compareTo(mem.getName());
	}
}

//회원번호의 내림차순으로 정렬하는 외부 정렬 기준 클래스를 이용하여 정렬하시오
// 클래스명  : SortNumDesc

class SortNumDesc implements Comparator<Member> {
	@Override
	public int compare(Member mem1, Member mem2) {
		// 방법1
		/*
		 * if(mem1.getNum() > mem2.getNum()) { return -1; }else if(mem1.getNum() <
		 * mem2.getNum()) { return 1; }else { return 0; }
		 */
		// 방법 2
		// return (mem1.getNum() - mem2.getNum()) * -1;

		// 방법 3 => Wrapper 클래스를 이용하는 방법
		// return new Integer(mem1.getNum()).compareTo(mem2.getNum()) * -1;

		// 방법 4 => Wrapper 클래스 이용하는 방법2
		return Integer.compare(mem1.getNum(), mem2.getNum()) * -1;
	}
}

'JAVA > 개념정리' 카테고리의 다른 글

Equals, HashCode  (0) 2022.10.28
ArrayList  (0) 2022.10.28
JDBC (DB와 연결)  (0) 2022.10.10
컬렉션 프레임워크  (0) 2022.10.10
API 클래스  (0) 2022.10.10
Comments