상세 컨텐츠

본문 제목

고급자바1219-2

자바

by 정재화니 2022. 12. 19. 12:48

본문

정렬과 관련된 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

관련글 더보기