C++에서 알고리즘 문제를 해결 할 때는 (x, y)형태의 좌표 또는 (시간, 거리) 등을 Pair 클래스를 유용하게 사용했다.
javafx에서 Java도 Pair 객체를 제공하지만 알고리즘 사이트의 컴파일러에서 제공해주지 않거나 해서 해당 클래스를 사용하지 못하게 될 경우 간단하게 Pair Class를 구현 할 수 있다.
private class Pair<L, R>{
L left;
R right;
private Pair(L left, R right){
this.left = left;
this.right = right;
}
}
private 접근제한자로 만들면 다른 클래스에서 사용할 수 없으니 접근제한자는 필요에 따라 구분해준다.
이제 해당 객체를 List 객체를 사용해 관리한다면 다음과 같이 사용할 수 있다.
LinkedList<Pair<Integer, String>> pairArr = new LinkedList<>();
pairArr.add(new Pair<>(1,"aa"));
pairArr.add(new Pair<>(1,"ab"));
pairArr.add(new Pair<>(2,"ac"));
pairArr.add(new Pair<>(2,"ad"));
pairArr.add(new Pair<>(3,"ae"));
pairArr.add(new Pair<>(3,"af"));
pairArr.add(new Pair<>(4,"ag"));
pairArr.add(new Pair<>(4,"ah"));
여기서 LinkedList는 List를 조상 클래스로 두고 있으며 Collections.sort에서 List를 파라미터로 사용하므로 sort를 사용해 커스텀 객체를 편리하게 정렬 할 수 있다.
sort 메서드는 Comparable 인터페이스의 compareTo(Object o) 를 기본으로 사용하며, 파라미터로 Comparator 인터페이스의 구현체를 넘겨주는 방식으로 사용할 수 있다.
사용방법 첫번째는 Comparable 인터페이스를 구현하는 것이다.
private class Pair<L, R> implements Comparable{
L left;
R right;
private Pair(L left, R right){
this.left = left;
this.right = right;
}
public int compareTo(Object o){
return this.left != (Pair)o.left ? (Pair)o.left - this.left : (Pair)o.right.compareTo(this.right)); // 내림차순
}
}
두번째 사용 방법으로 Collections.sort를 호출하여 파라미터에 Pair 객체를 넣어주고 Comparator를 익명 메서드로 작성하여 넣어서 사용해보자.
Comparator를 따로 작성해서 사용해도 된다.
Collections.sort(pairArr, new Comparator<Pair<Integer, String>>() {
@Override
public int compare(Pair<Integer, String> o1, Pair<Integer, String> o2) {
return (o1.left != o2.left ? o2.left - o1.left : o2.right.compareTo(o1.right));
}
});
위와 같이 Collections.sort를 사용하여 Pair의 left를 내림차순으로, Pair의 left가 같다면 right를 String compareTo를 사용해 사전 내림자순으로 정렬하였다.
해당 방법으로 Triple 등의 객체를 구현해 정렬하는 방법도 가능하며, sorting 알고리즘에 관련된 문제를 손쉽게 해결 할 방법이 될 수도 있다.
[결과]
----------정렬 전
[1, aa]
[1, ab]
[2, ac]
[2, ad]
[3, ae]
[3, af]
[4, ag]
[4, ah]
----------정렬 후
[4, ah]
[4, ag]
[3, af]
[3, ae]
[2, ad]
[2, ac]
[1, ab]
[1, aa]