개인적으로 장단점에 관계 없이 stream API를 사용하는것을 선호하진 않는다.

 

우선 회사 업무 환경부터 JDK 1.6...을 사용하기 때문에 stream과 lamda식 표현이 너무 익숙하지 않고,

유지보수에 적절하지 않다고 생각하기 때문이다.

 

그래도 알고리즘 문제를 풀다보면 배열을 리스트로, 리스트를 배열로 바꿔야 하는 상황을 자주 마주치게 되는데, for문을 사용하여 원소를 하나씩 옮겨주는 것 보단 stream을 사용하는게 깔끔한 코드에 도움이 되는 것 같다.

 

> 예제 (배열을 리스트로)

import java.util.Arrays;
import java.util.stream.Collectors;
List list = Arrays.stream(yourArray).boxed().collect(Collectors.toList());

 

> 예제 (리스트를 배열로)

// Integer wrapper class를 사용한 list를 array로 변환
int[] intArray = yourList.stream().mapToInt(Integer::intValue).toArray();

 

728x90
반응형

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