2020.10.22 고급자바 수업 노트 ListSortTest , ListSortTest2

나의 이해 


오름차순 : Collections.sort(list);  

String 객체에서는 정렬을 위해서 compareTo() 메서드가 구현되어 있다. 

앞문자열.compareTo(뒤문자열); 

반환값은 오름차순에 맞게 반환된다.  ( 이 값은 위에 compareTo 이게 적용이되서

오름차순을 만들어주기 위해 반환값을 해준다. 즉 반환값이 이루어지면서 

오름차순을 만들어주는것이다. 




compareTo() 는 String 타입만 가능하다. 

comparable 인터페이스는 compareTo() 메서드가 선언되어 있다. 

그래서 이 compareTo() 메서드를 재정의 해서 정렬기준을 내가원하는데 대로 지정

사용자가 작성하는 클래스 내부에 정렬기준을 지정하려면 Comparble 인터페이스

를 구현해서 작성해야 한다. ( 내부 정렬기준을 넣어서 클래스를 작성한다 ) 

compareTo() 메서드를 재정의 해서 정렬기준을 지정한다. 

내부정렬기준. 





 package kr.or.ddit.basic;


import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;


public class ListSortTest {

1.클래스만들기


public static void main(String[] args) {

ArrayList<String> list = new ArrayList<>(); 

         2.String 제네릭타입인 ArrayList 타입인 list 객체생성 

list.add("일지매" ); 

list.add("홍길동" ); 

list.add("성춘향" ); 

list.add("변학도" ); 

list.add("이순신" ); 

                3.ArrayList 타입에 이름 넣어줌



System.out.println("정렬전 : " + list);


//정렬은 Collections.sort() 메서드를 이용하여 정렬한다. 

//문자열의 정렬은  기본적으로 오름차순으로 정렬을 수행한다. 

//정렬방식 : 기본적으로는 오름차순으로 정해져 있다. : 내부 정렬방식 

4. 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);

                내가 원하는 방식으로 정렬해주려면 Collections.sort(list, 내가정렬원하는 외부정렬순서)



comparator 는 내가 원하는 방식으로 만들어 줄때 사용한다. 

그것을 여기서 만들어준다. 

//정렬 방식을 정해주는 Class를 작성한다. (외부 정렬 기준 클래스라고 한다. ) 

//comparator 인터페이스를 구현해서 작성한다. 

class Desc  implements Comparator<String>{

//compare() 메서드를 재정의해서 정렬하고자 하는 기준을 정한다. 

//compare()  메서드의 반환값 

//반환값이 0 이면 ==> 순서를 변경하지 않는다 (두 값이 같다.)  

//반환값이 양수 ==> 앞, 뒤 값의 순서를 변경한다. 

//반환값이 음수 ==> 순서를 변경하지 않는다. 

// 예 ) 오름차순일 경우 ==> 앞의 값이 크면 양수를 반환, 같으면 0 , 뒤의 값이 크면 음수를 반환 


//String 객체에는 정렬을 위해서 compareTo() 메서드가 구되어 있는데 

// 이 메서드의 반환값은 오름차순에 맞게 반환되도록 구현되어 있다. 

// 형식) 앞문자열.compareTo(뒤문자열); 

//(Wrapper 클래스와 Date, File 클래스에도 구현되어 있다. ) 

                compareTo() String 에  원래 있는 메서드 , 


@Override

public int compare(String str1, String str2) {

//내림차순으로 정렬되도록 구현하기 

//그냥 return 으로만 해도 동일함 

/* if(str1.compareTo(str2)>0 ) { 

return -1;

}else if (str1.compareTo(str2) == 0 ) { 

return 0 ;

}else { 

return 1 ; 

}

*/

return str1.compareTo(str2) * -1 ; 

}

}


-----------------------------------------------------------------------------------------------------

package kr.or.ddit.basic;


import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;


public class ListSortTest2 {


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(10, "성춘향" , "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);

} //for 문닫은것 

System.out.println("----------------------------------------------");

Collections.sort(memList);

//오름차순으로 정렬을 한다. 

System.out.println("회원이름의 오름차순 정렬후...");

for(Member mem : memList) { 

System.out.println(mem);

} //for문

System.out.println("---------------------------------------");

Collections.sort(memList, new SortNumDesc());

//내가 원하는 데로 정렬을 해줌 . 

System.out.println("회원번호의 내림차순 정렬후...");

for(Member mem : memList) { 

System.out.println(mem);

} //for 문

System.out.println("---------------------------------------");

}  //main 닫음 


}  //ListSortTest2 클래스 닫음 



// 사용자가 작성하는 클래스 내부에 정렬기준을 지정하려면  Comparable 인터페이스를 구현해서 작성해야 한다. 

// (내부 정렬기준을 넣어서 클래스를 작성한다. ) 



//Comparable 인터페이스는 compareTo() 메서드가 선언되어 있다. 

//그래서 이 compareTo() 메서드를 재정의 해서 정렬 기준을 지정한다. 


//예 ) 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;

}  //Member 생성자 선언 


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 + "]";

}   //TOsTRING () 만들어줌  ( 이건 기본적으로 배열에서 생략되어 있는 부분 ) 

/*

public Member(int num, String name, String tel) { 

this.num = num ; 

this.name = name; 

this.tel = tel; 

}

*/

@Override

public int compareTo(Member mem) {

return this.getName().compareTo(mem.getName());

//현재 멤버 num , name , tel 과 매게변수 mem 과 비교한다. 

}  //compareto 닫은부분 내부정렬기준 바꿔줌 

} //class implements  멤버 닫아줌 



//Member 클래스의 회원번호(num) 의 내림차순으로 정렬할 외부 정렬 기준 클래스 작성 

class SortNumDesc implements Comparator<Member>{


//원래 있던 오름차순이었던 compare 라는 것을 바꿔주는것 

@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 new Integer(mem1.getNum()).compareTo(mem2.getNum()) * -1 ; 

*/

//Wrapper 클래스를 이용하는 방법2 

return Integer.compare(mem1.getNum(), mem2.getNum()) * -1; 

}  //compare 닫은곳

} // implements 닫은것  



댓글