반응형
자바 Collection Framework 정렬하기
객체에 Comparable 인터페이스 상속받아 정렬
- 사용자가 정의한 객체에서 Comparable<클래스명> 인터페이스를 상속받 compareTo 메서드를 구현함으로써 사용자가 정의하는 정렬 기준을 정할 수 있다.
- 아래의 예시에서는 두개의 int 필드를 갖는 객체가 number1을 우선 기준으로 정렬한뒤 number2를 기준으로 정렬하는 형태로 정의하였다.
- 사용할 객체
class myObject implements Comparable<myObject> {
String name;
int number1;
int number2;
public myObject(String name, int number1, int number2) {
this.name = name;
this.number1 = number1;
this.number2 = number2;
}
@Override
public int compareTo(myObject o) {
if(this.number1 < o.number1){
return -1;
}
if(this.number1 > o.number1){
return 1;
}
if(this.number2 < o.number2){
return -1;
}
if(this.number2 > o.number2){
return 1;
}
return 0;
}
@Override
public String toString() {
return "[" + this.name + "," + this.number1 + "," + this.number2 + "]";
}
}
- 테스트
public class Sort_Comparable {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new myObject("A", 2, 2));
list.add(new myObject("A", 1, 1));
list.add(new myObject("A", 2, 1));
list.add(new myObject("A", 1, 2));
System.out.println("before sorting:" + list);
Collections.sort(list);
System.out.println("after sorting:" + list);
}
}
- 출력
Comparator 인터페이스의 compare 메소드를 오버라이딩 하여 정렬
- 위와 유사하지만 다른 인터페이스인 Comparator를 이용하여 커스텀 정렬이 가능하다.
- Comparable 인터페이스의 경우 사용하는 객체에 상속함으로 사용했지만 Comparator 인터페이스는 정렬하는 객체와는 별개로 구현한다.
- Comparator 인터페이스를 상속받는 객체를 정의해 주거나 이너클래스형태로 작성이 가능함.
- 상속하여 객체 정의 할 경우
- 객체에 Comparator 인터페이스를 직접 상속할 시에도 제네릭은 정렬할 객체로 지정해 주어야 사용이 가능하다!
- 객체에 Comparator 인터페이스를 직접 상속할 시에도 제네릭은 정렬할 객체로 지정해 주어야 사용이 가능하다!
- 이너 클래스로 사용할 경우
- 정렬할 클래스 정의
class myComparator implements Comparator<myObject2> {
@Override
public int compare(myObject2 o1, myObject2 o2) {
if(o1.number1 < o2.number1){
return -1;
}
if(o1.number1 > o2.number1){
return 1;
}
if(o1.number2 < o2.number2){
return -1;
}
if(o1.number2 > o2.number2){
return 1;
}
return 0;
}
}
- 이너클래스로 정렬
- 아래 코드와 같이 Collections.sort() 사용시 정렬할 컬랙션 객체와 정의된 Comparator 상속받은 객체 or 이너클래스를 파라미터로 넘겨준다.
public class Sort_Comparator { public static void main(String[] args) { ArrayList<myObject2> list = new ArrayList<myObject2>(); list.add(new myObject2("A", 2, 2)); list.add(new myObject2("A", 1, 1)); list.add(new myObject2("A", 2, 1)); list.add(new myObject2("A", 1, 2)); System.out.println("before sorting:" + list); // 아래 new Comparator 이너클래스 대신 위에 정의한 myComparator 객체를 생성하여 넣어도됨. // Collection.sort(list,new myComparator()); Collections.sort(list, new Comparator<myObject2>() { @Override public int compare(myObject2 o1, myObject2 o2) { if(o1.number1 < o2.number1){ return -1; } if(o1.number1 > o2.number1){ return 1; } if(o1.number2 < o2.number2){ return -1; } if(o1.number2 > o2.number2){ return 1; } return 0; } }); System.out.println("after sorting:" + list); } }
- 출력
람다식 사용
위 소스를 아래와 같이 람다식으로 사용 가능함.
public class Sort_Comparator {
public static void main(String[] args) {
ArrayList<myObject2> list = new ArrayList<myObject2>();
list.add(new myObject2("A", 2, 2));
list.add(new myObject2("A", 1, 1));
list.add(new myObject2("A", 2, 1));
list.add(new myObject2("A", 1, 2));
System.out.println("before sorting:" + list);
// 아래 new Comparator 이너클래스 대신 위에 정의한 myComparator 객체를 생성하여 넣어도됨.
// Collection.sort(list,new myComparator());
Collections.sort(list, (o1,o2) -> {
if(o1.number1 < o2.number1){
return -1;
}
if(o1.number1 > o2.number1){
return 1;
}
if(o1.number2 < o2.number2){
return -1;
}
if(o1.number2 > o2.number2){
return 1;
}
return 0;
} );
System.out.println("after sorting:" + list);
}
}
'언어 > Java' 카테고리의 다른 글
[JUnit5] 테스트 코드 시작해보기 - 2 (0) | 2022.07.15 |
---|---|
[JUnit5] 테스트 코드 시작해보기 - 1 (0) | 2022.06.15 |
[Java] JVM 메모리 구조 (JVM Memory Structure) (0) | 2020.08.04 |
[Java] == 연산자와 equals() 매서드의 차이 (0) | 2020.08.04 |
[Java] Call by value & Call by reference (0) | 2020.07.29 |
댓글