나의 이해
오름차순 : 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 닫은것
댓글
댓글 쓰기