일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 맥
- crud
- Android
- nodejs
- 이클립스
- ibatis
- 반복문
- JDBC
- 객체지향
- 단축키
- python
- Oracle
- 컬렉션프레임워크
- 자바
- 자바문제
- servlet
- Error
- FastAPI
- spring
- pyqt
- 배열
- Mac
- Homebrew
- ddit
- jsp
- html
- Java
- API
- 대덕인재개발원
- 생활코딩
Archives
- Today
- Total
romworld
정렬(Comparable, Comparator) 본문
package kr.or.ddit.basic;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/*
* - 정렬과 관련된 interface는 Comparable, Comparator 이렇게 두 가지가 있다.
*
* - Comparable은 Collection에 추가되는 데이터 자체에 정렬 기준을 넣고 싶을 때 구현하는 인터페이스다.
* (즉, 내부 정렬 기준을 구현할 때 사용한다.)
* - Comparator는 외부에 별도로 정렬 기준을 구현하고 싶을 때 구현하는 인터페이스이다.
* (즉, 외부 정렬 기준을 구현할 때 사용한다.)
*
* - Comparable에서는 compareTo()메서드를 재정의 해야 하고
* Comparator에서는 compare()메서드를 재정의 해야 한다.
*
* - String클래스, Wrapper 클래스, Date클래스, File클래스등에는 내부 정렬 기준이 이미 구현되어 있다.
* (이 클래스들의 내부 정렬 기준은 오름차순으로 처리 되도록 구현되어 있다.)
*
* */
public class ListSortTest01 {
public static void main(String[] args) {
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.shuffle(list); // 자료를 섞어준다.
System.out.println("자료 섞기 후 :" + list);
// 외부 정렬 기준을 적용해서 정렬하기
Collections.sort(list, new Desc());
System.out.println("내림차순 정렬 후 : " + list);
}
}
// 정렬 방식을 정해주는 class를 만든다.(외부 정렬 기준 클래스라고 한다.)
// => Comparator인터페이스를 구현해서 작성한다.
class Desc implements Comparator<String>{
// compare()메서드를 이용해서 정렬하고자 하는 기준을 정해준다.
// compare()메서드의 반환값의 의미 및 역할
// 1. 반환값이 0이면 두 값이 같다.
// 2. 반환값이 '양수'이면 앞, 뒤의 순서를 바꾼다.
// 3. 반환값이 '음수'이면 앞, 뒤의 순서를 바꾸지 않는다.
// 예) 오름차순일 경우
// ==> 앞의 값이 크면 양수, 같으면 0, 앞의 값이 작으면 음수를 반환하도록 구현하면 된다.
@Override
public int compare(String str1, String str2) {
// 내림차순 정렬하기...
/*
if(str1.compareTo(str2) > 0) {
return -1;
}else if(str1.compareTo(str2)<0) {
return 1;
}
*/
return str1.compareTo(str2) * -1; // 간단하게 이렇게! 써도 됨 양수이면 -1 곱해져서 음수니까 순서가 바뀌지 않고 음수이면 -1 곱해져서 양수..
}
}
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<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.toString());
}
System.out.println("---------------------------------------------");
Collections.sort(memList); // 스트링이 아니라 객체일 경우 내부 정렬기준을 따로 정해주지 않으면 오류가남
// member 생성자 안에 num,name,tel이 있어서 정렬기준이 뭔지 정해줘야함
System.out.println("회원이름을 기준으로 오름차순 정렬 후....");
for (Member mem : memList) {
System.out.println(mem);
}
System.out.println("---------------------------------------------");
// 회원번호의 내림차순으로 정렬하는 외부 정렬 기준 클래스를 이용하여 정렬하시오
// 클래스명 : SortNumDesc
Collections.sort(memList, new SortNumDesc());
System.out.println("회원번호 기준으로 내림차순 정렬 후....");
for (Member mem : memList) {
System.out.println(mem);
}
System.out.println("---------------------------------------------");
}
}
// 회원관리를 위한 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;
}
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 + "]";
}
// ==> 회원이름을 기준으로 오름차순이 되도록 내부 정렬 기준을 지정하기
@Override
public int compareTo(Member mem) { // this(나자신)하고 매개변수를 비교
return this.getName().compareTo(mem.getName());
}
}
//회원번호의 내림차순으로 정렬하는 외부 정렬 기준 클래스를 이용하여 정렬하시오
// 클래스명 : SortNumDesc
class SortNumDesc implements Comparator<Member> {
@Override
public int compare(Member mem1, Member mem2) {
// 방법1
/*
* if(mem1.getNum() > mem2.getNum()) { return -1; }else if(mem1.getNum() <
* mem2.getNum()) { return 1; }else { return 0; }
*/
// 방법 2
// return (mem1.getNum() - mem2.getNum()) * -1;
// 방법 3 => Wrapper 클래스를 이용하는 방법
// return new Integer(mem1.getNum()).compareTo(mem2.getNum()) * -1;
// 방법 4 => Wrapper 클래스 이용하는 방법2
return Integer.compare(mem1.getNum(), mem2.getNum()) * -1;
}
}
'JAVA > 개념정리' 카테고리의 다른 글
Equals, HashCode (0) | 2022.10.28 |
---|---|
ArrayList (0) | 2022.10.28 |
JDBC (DB와 연결) (0) | 2022.10.10 |
컬렉션 프레임워크 (0) | 2022.10.10 |
API 클래스 (0) | 2022.10.10 |
Comments