Collections.ソートの問題

3909 ワード

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<>();

		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);
		 }
		 System.out.println("--------------------------------------------");
		 
		 //회원 번호의 내림차순을 정렬하기
		 
		 Collections.sort(memList, new SortNumDesc());
         System.out.println("회원번호의 내림차순 정렬후 ..");//입력한 순서 그대로
		 for(Member mem : memList){
			 System.out.println(mem);
		 }
		 System.out.println("--------------------------------------------");
	}	 
}
//メンバークラスのメンバー名に基づいて昇順ソートします.
//内部ソート基準=>実装Compabiledインタフェースを追加します.
//アルトヒース:ジェネレータの自動作成
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;
	}
	
	public void setNum(int num){//데이터 세팅 (알트 쉽 s)
		this.num = num;
	}
	
	public int getNum(){
		return this.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() {//뽑아줄 값 toString
		return "Member [num=" + num + ", name=" + name + ", tel=" + tel + "]";
	}

	// 내부 정렬 기준을 설정하는 메서드 구현하기
	//(회원이름의 오름차순 기준 설정)
	@Override
	public int compareTo(Member mem) {//괄호 속에 오는 것이 다른 멤버 클래스(this가 앞의 데이터 매개변수가 되는 데이터는 뒤의 데이터)

		return this.getName().compareTo(mem.getName());
		//이름값을 가져오고 타입에 따라 정렬 방식을 이용하여 사용함: this가 앞의 데이터 뒤에가 메개변수 데이터
		
	}
	
	
}
   //Member 클래스의 회원번호(num)를 기준으로 내림차순되는 외부정렬기준
   //외부정렬기준 class를 작성하시오.(외부니까 클래스로 빼준거임)
   
 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 1;
                //뒤의 값이 크면 내림차순이니까 순서가 바뀌어야 되고 리턴 값으로 양수가 나와야됨
			}else{
				return 0;
			}*/
		
		 //Wrapper클래스를 이용하는 방법1
		 //return new Integer(mem1.getNum()).compareTo(mem2.getNum()) * -1;
         //-1을 곱해주면 부호를 쉽게 바꿀 수 있음
		 
		//Wrapper클래스를 이용하는 방법2
		 return Integer.compare(mem1.getNum(), mem2.getNum()) * -1;
		 //compare는 static메서드
		}
 }


compare메서드의 반환값
- 반환값이 0 : 두 값이 같다.
- 반환값이 양수: 두 값의 순서를 바꾼다.
- 반환값이 음수: 두 값의 순서를 바꾸지 않는다.