단일 타입으로 이루어진 리스트의 경우, Comparator, Comparable을 재정의 하지 않아도 그대로 갖다 쓸 수 있었다.
하지만 객체는 여러 프로퍼티를 가지고 있기에 이런 비교 객체를 따로 재정의 함으로써
비교 기준을 만들어줘야 한다.
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.util.Comparator;
import static java.lang.Math.min;
// 롬복 적용
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class Student implements Comparable<Student> {
private String name;
private int studentNo;
private String grade;
@Override
public int compareTo(Student o) {
return o.getName().compareTo(this.name)*-1; //오름차순
}
}
이 때 사용자 정의 비교를 위해서는 Comparator객체를 만들어야 하는데,
1개를 기준으로 비교하는 경우 compareTo을
2개를 기준으로 비교하는 경우 compare을 재정의하면 된다.
1개를 기준으로 비교하는 만큼, 비교하려는 객체 안에서 재정의를 시켜줘야한다.
즉 오버라이딩이 한번밖에 불가능한 만큼
=> 기준 객체가 고정된 경우 사용하면 좋다.
///student.java
public class Student implements Comparable<Student>
우선 Comparable< T >를 통해 구현체를 만들어주고,
@Override
public int compareTo(Student o) {
return o.getName().compareTo(this.name)*-1; //오름차순
}
compareTo를 오버라이딩하여 비교 시 기준을 만들어준다.
comparator을 사용하기 위해서는 comapare을 오버라이딩 해야한다.
따로 서비스 파일 내에 Comparator 구현체 클래스를 만들어준다.
즉 비교 객체를 여러개 만들 수 있는만큼
=> 기준 객체가 여러개인 경우 사용하면 좋다.
//StudentService.java
class StudentNoComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if(o1.getStudentNo()>o2.getStudentNo()) return 1;
//f리턴이 양수라면 o1,o2자리 변경
else if(o1.getStudentNo()<o2.getStudentNo())return -1;
return 0;//변경XXX
}
}
참고로 a<b 일 때 1을 리턴하게 되면 정렬 시 순서가 바뀌게 된다. b, a로 나타나진다는 말
public class Ex01Sort {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<Student>();
studentList.add(new Student("it",28,"Junior"));
studentList.add(new Student("java",20,"Expert"));
studentList.add(new Student("dev",1002,"Junior"));
studentList.sort(new StudentNoComparator());
studentList.sort(Comparator.naturalOrder());
//Comparable을 학생번호를 기준으로 정의했기 때문에 이제 기준점(학생번호) 가 생김
System.out.println("학생이름(오름차순):"+studentList);
}
}
``
```실행결과
[Student(name=it, studentNo=28, grade=Junior), Student(name=java, studentNo=20, grade=Expert), Student(name=dev, studentNo=1002, grade=Junior)]
=======
학생이름(오름차순):[Student(name=dev, studentNo=1002, grade=Junior), Student(name=it, studentNo=28, grade=Junior), Student(name=java, studentNo=20, grade=Expert)]