Java Collection Framework Part 4.

Peace·2022년 2월 21일
0
post-thumbnail

🙌 Arrays, Comparator, Comparable를 알아보기

🧐 Arrays란 ❓

말그대로 배열에 대한 클래스다. 그렇기 때문에, 배열을 다루는데 유용한 메서드가 정의되어 있다.

🧐 Arrays는 어떤 method를 가지고 있을까❓

  • 배열의 복사

    • copyOf(): 배열의 전체, copyOfRange(): 배열의 일부를 복사해서 새로윤 배열을 만들어 반환.
  • 배열 채우기

    • fill(): 배열의 모든 요소를 지정된 값으로 채운다.
    • setAll(): 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다. 함수형 인터페이스를 구현한 객체를 매개변수로 지정하거나 람다식을 지정해야한다.

여기서, 함수형 인터페이스란 1개의 추상 메소드를 갖는 인터페이스를 의미한다.

  • 배열의 정렬과 검색
    • sort(): 말 그대로 배열을 정렬할 때 사용한다.
    • binarySearch(): 배열에서 지정된 값이 저장된 위치를 찾아서 반환한다. 하지만, 배열이 정렬된 상태일 때 사용해야 올바른 결과를 얻을 수 있다.

이진 탐색은 앞에서 부터 하나씩 탐색하는 것이 아닌, 검색할 범위를 반복적으로 절반씩 줄여가면서 검색하기에 검색 속도가 빠르다. 검색할 범위를 반복적으로 줄일 수 있는 것은 해당 배열이 정렬되어 있다는 것을 전제하에 줄일 수 있기 때문에, 정렬되어 있는 배열에서만 사용해야 올바른 결과를 얻을 수 있다.

🧐 Compartor와 Comparable이란 ❓

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이 작은 순서대로 정렬이 된다.

Reference

  • Java의 정석 2편 - 남궁성
profile
https://peace-log.tistory.com 로 이사 중

0개의 댓글