말그대로 배열에 대한 클래스다. 그렇기 때문에, 배열을 다루는데 유용한 메서드가 정의되어 있다.
배열의 복사
배열 채우기
여기서, 함수형 인터페이스란 1개의 추상 메소드를 갖는 인터페이스를 의미한다.
이진 탐색은 앞에서 부터 하나씩 탐색하는 것이 아닌, 검색할 범위를 반복적으로 절반씩 줄여가면서 검색하기에 검색 속도가 빠르다. 검색할 범위를 반복적으로 줄일 수 있는 것은 해당 배열이 정렬되어 있다는 것을 전제하에 줄일 수 있기 때문에, 정렬되어 있는 배열에서만 사용해야 올바른 결과를 얻을 수 있다.
Compartor, Comparable 모두 인터페이스이다. 두 인터페이스는 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다. Comparable를 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 비교할수 있다.
public interface Compartor{
int compare(Object o1, Object o2);
boolean equals(Object obj);
}
public interface Comparable{
public int compareTo(Object o);
}
원하는 타입의 객체를 정렬하고 싶다면, 둘 중 하나의 인터페이스를 구현하고, compare, compareTo method를 오버라이딩하면 된다.
두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현해야한다.
알고리즘 문제를 풀 때는 익명 클래스를 사용하여 구현해서 사용할 수 있다.
public class Main{
public static class Node{
private int num;
private int weight;
public Node(int num, int weight){
this.num = num;
this.weight = weight;
}
int getNum(){
return num;
}
int getWeight(){
return weight;
}
}
public static void main(String[] args) throws Exception{
List<Node> graph = Arrays.asList(new Node(1,20),new Node(2,20),new Node(3,40));
graph.sort(new Comparator<Node>(){
@Override
public int compare(Node o1, Node o2){
if(o1.getWeight() < o2.getWeight()) return 1;
else if(o1.getWeight() == o2.getWeight()) {
if(o1.getNum() < o2.getNum()) return -1;
}
else return -1;
}
});
}
}
위 처럼 사용하면, Node의 weight가 큰 순서대로 정렬을 할 수 있고, 만약 weight가 같다면, num이 작은 순서대로 정렬이 된다.