Jun's Blog

[Java] ListSort (Comparable & Comparator) 본문

High Java/Collection FrameWork

[Java] ListSort (Comparable & Comparator)

Fizzyelf 2020. 9. 26. 15:36

  정렬과 관련된 InterfaceComparableComparator가 존재한다.

 

  => 보통 객체 자체에 정렬기능을 넣기 위해서는 Comparable을 구현하고,

       정렬 기준을 별도로 구현하고 싶을 때는 Comparator를 구현하여 사용한다.

 

  => Comparable에서는 CompareTo() 메서드를 구현하고, 

       Comparator에서는 Compare() 메서드를 구현한다.

 

package kr.or.ddit.basic;

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

public class T02_ListSortTest {

	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		
		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라는 인터페이스를 구현해야 한다.
 * 이 Comparator 인터페이스의 compare()라는 메서드를 재정의 하여 구현하면 된다.
 */
class Desc implements Comparator<String> {
/**
 * compare() 메서드의 변환값을 결정하는 방법
 * => 이 메서드가 양수를 반환하면 두 값의 순서가 바뀐다.(오름차순이 기본이다)
 * 
 * - 오름차순 정렬일 경우..
 * => 앞의 값이 크면 양수, 같으면 0, 앞의 값이 작으면 음수를 반환하도록 한다.
 * 
 * - String 객체에는 정렬을 위해서 compareTo()메서드가 구현되어 있는데
 *   이 메서드의 반환값은 오름차순에 맞게 변환되도록 구현되어 있다.
 *   (Wrapper 클래서와 Date, File 클래스에도 구현되어 있다.)
 */
	@Override
	public int compare(String str1, String str2) {
		return str1.compareTo(str2) * 1; // 1이면 오름차순, -1이면 내림차순
	}
	
}

결과 콘솔 창

 


package kr.or.ddit.basic;

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

public class T03_ListSortTest {
	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);
		}
		System.out.println("----------------------------------");
	
	
	}
}
/**
 * 정렬 기준의 외부 선언을 위해서는 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;
//		} else {
//			return 1;
//		}
		
		// Wrapper 클래스에서 제공하는 메서드를 이용하는 방법1
		/*
		 * return Integer.compare(mem1.getNum(), mem2.getNum()) * -1;
		 */
		
		// Wrapper 클래스에서 제공하는 메서드를 이용하는 방법2
		  return new Integer(mem1.getNum()).compareTo(mem2.getNum()) * -1;		 
		
	}
	
}

/**
 * 회원의 정보를 저장할 클래스
 * (회원 이름을 기준으로 오름차순 정렬이 될 수 있는 클래스 만들기)
 */
class Member implements Comparable<Member> {
	private int num;		// 번호
	private String name;	// 이름
	private String tel;		// 전화번호
	
	/**
	 * 이름 기준으로 오름차순 정렬이 되도록 설정한다
	 */
	@Override
	public int compareTo(Member mem) {
		
		return getName().compareTo(mem.getName());
	}
	


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

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



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



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



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



	public int getNum() {
		return num;
	}



	public String getName() {
		return name;
	}



	public String getTel() {
		return tel;
	}
	
}

결과 콘솔 창

 

Comments