예제 - 1
import java.util.Arrays;
class Person implements Comparable<Person> {
String name;
int age;
String job;
int score;
public Person(String name, int age, String job, int score) {
this.name = name;
this.age = age;
this.job = job;
this.score = score;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age +
", job=" + job + ", score=" + score + "]\n";
}
@Override
public int compareTo(Person o) { //정렬의 기준을 정의~!!
//this(Person)의 속성과 o(Person)의 속성을 비교
//비교방법 this.속성 - o.속성
//결과: 음수, 0, 양수 ==> 음수의 경우 swap을 해줌 ==> 오름차순 정렬
// return this.age - o.age; //오름차순정렬
//만약 내림차순 정렬을 하고 싶다!!
//1
//return o.age - this.age;
//2
return -(this.age - o.age) ;
}
}
public class ArraySortTest {
public static void main(String[] args) {
int[]su= {13, 8, 7, 10, 100, 5};
char[]ch= {'A','l','g','o','r','i','t','h','m'};
String[]names= {"홍길동","길라임","김주원"};
//API를 사용하여 배열에 대한 오름차순 정렬을 하자!!
Arrays.sort(su);
Arrays.sort(ch);
Arrays.sort(names);
//배열 내용 출력
System.out.println("정수배열>>"+Arrays.toString(su));
System.out.println("문자배열>>"+Arrays.toString(ch));
System.out.println("문자열배열>>"+Arrays.toString(names));
//객체 배열 정렬
Person p = new Person("갓길동",11,"학생",95);
// ==> 이름 나이 직업 점수
Person[] persons= {p ,
new Person("빛길동",19,"학생",80),
new Person("남길동",14,"학생",100),
new Person("여길동",17,"학생",99),
new Person("킹길동",15,"학생",56)};
Arrays.sort(persons);
System.out.println("사람배열>>"+Arrays.toString(persons));
// class Person cannot be cast to class java.lang.Comparable
// (Person is in unnamed module of loader 'app';
// java.lang.Comparable is in module java.base of loader 'bootstrap')
}//main
}
예제 - 2
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
public class ArraySortTest2 {
static class Person implements Comparable<Person> {
// static class Person implements Comparator<Person> {
String name;
int age;
String job;
int score;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, int age, String job, int score) {
this.name = name;
this.age = age;
this.job = job;
this.score = score;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age +
", job=" + job + ", score=" + score + "]\n";
}
@Override
public int compareTo(Person o) { //정렬의 기준을 정의~!!
//this(Person)의 속성과 o(Person)의 속성을 비교
//비교방법 this.속성 - o.속성
//결과: 음수, 0, 양수 ==> 음수의 경우 swap을 해줌 ==> 오름차순 정렬
return this.age - o.age; //오름차순정렬
//만약 내림차순 정렬을 하고 싶다!!
//1
//return o.age - this.age;
//2
// return -(this.age - o.age) ;
}
// @Override
// public int compare(Person o1, Person o2) {
// return -(o1.age - o2.age); //나이 오름차순 정렬
// }
}
public static void main(String[] args) {
//객체 배열 정렬
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("갓길동",11,"학생",95));
list.add(new Person("빛길동",19,"학생",80));
list.add(new Person("남길동",14,"학생",100));
list.add(new Person("여길동",17,"학생",99));
list.add(new Person("킹길동",15,"학생",56));
// Arrays.sort(list);//에러발생: Arrays클래스의 sort메소드를 통해 Collection(List)의 정렬을 할 수 없음~!!
Collections.sort(list); //Comparable일 경우
// Collections.sort(list,new Person()); //Comparator일 경우 Collections.sort(list, Comparator객체);
System.out.println(list);
}//main
}
예제 - 3
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
public class ArraySortTest3 {
static class Person {
String name;
int age;
String job;
int score;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name, int age, String job, int score) {
this.name = name;
this.age = age;
this.job = job;
this.score = score;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age +
", job=" + job + ", score=" + score + "]\n";
}
}//Person
public static void main(String[] args) {
//객체 배열 정렬
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("갓길동",11,"학생",95));
list.add(new Person("빛길동",19,"학생",80));
list.add(new Person("남길동",19,"학생",100));
list.add(new Person("여길동",19,"학생",99));
list.add(new Person("킹길동",15,"학생",56));
//나는 특정인터페이스를 상속받지 않는 Person을 사용하고 싶다!!
//추가 문제) Person을 age오름차순으로 하되 같은 age의 경우 score내림차순으로 정렬하시오.
Collections.sort(list, new Comparator<Person>() {//내부클래스 시작
//implements Comparator의 의미
@Override
public int compare(Person o1, Person o2) {
if(o1.age == o2.age) return o2.score - o1.score;
return o1.age - o2.age;
}
}//내부클래스 끝
);
System.out.println(list);
}//main
}
정리
##### <sort정리>
1. 기본자료형, String 배열의 Sort
==> Arrays.sort( 기본자료형 배열 )사용
##### 2. 객체자료형(예:Person) 배열의 Sort
==> Arrays.sort( 객체자료형 배열 )
==> ** 반드시 정렬객체에 implements Comparable 사용 **
==> compareTo메소드 오버라이딩 필요
return this.속성-o.속성; //오름차순
return o.속성-this.속성; 또는 return -(this.속성-o.속성); //내림차순
##### 3. List컬렉션을 사용하는 경우
==> ☆Collections.sort(컬렉션) 사용, ★Collections.sort(컬렉션, Comparator객체) 사용
==> ☆의 경우, 위의 2번처럼 ** 정렬객체에 implements Comparable **이면 동일하게 사용할 수 있음
==> compareTo메소드 오버라이딩 필요
return this.속성-o.속성; //오름차순
return o.속성-this.속성; 또는 return -(this.속성-o.속성); //내림차순
==> ★의 경우
방법1) ** 정렬 객체에 implements Comparator ** 사용
==> compare메소드 오버라이딩 필요
return o1.속성-o2.속성; //오름차순
return o2.속성-o1.속성; 또는 return -(o1.속성-o2.속성); //내림차순
방법2) 정렬 객체에 implements Comparator 사용 하지 않고 익명의 내부클래스 사용
==> Collections.sort(컬렉션, new Comparator(){
compare메소드 오버라이딩
});
'코딩테스트' 카테고리의 다른 글
백준 - 9081 번 단어 맞추기 (0) | 2025.04.12 |
---|---|
NextPermutation (0) | 2025.04.12 |
CompleteBinaryTree(완전이진탐색) (0) | 2025.04.11 |
백준 - 1158 번 요세푸스 (0) | 2025.04.11 |
백준 - 10845번 (0) | 2025.04.11 |