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]

728x90
반응형

+ Recent posts