본문 바로가기
프로그래밍/Java

Java - Collection (2)

by 왕거 2020. 10. 9.

컬렉션에서 이어지는 내용으로 정렬 및 검색(찾기)에 관련된 내용이었다.

 

 

정렬

  • List<E>를 구현한 컬렉션 클래스들은 저장된 인스턴스를 정렬된 상태로 유지하지 않기때문에 정렬이 필요하다면 추가적인 메소드를 사용해야 한다.
    public static void main(String[] args) {
	List<String> list = Arrays.asList("Man", "Game", "Java", "Program");
	list = new ArrayList<>(list);

	for(Iterator<String> itr = list.iterator(); itr.hasNext();) {
	    System.out.print(itr.next() + "\t");
    	}
	System.out.println();

        Collections.sort(list); //정렬 메소드 호출 및 사용

        for(Iterator<String> itr = list.iterator(); itr.hasNext();) {
            System.out.print(itr.next() + "\t");
        }
        System.out.println();
    }

정렬 전, 후

  • Collections 클래스에 정의되어 있는 sort 메소드를 사용해서 정렬을 수행
    • 정의) public static <T extends Comparable <T>> void sort(List<T> list);
    • T는 Comparable 인터페이스를 구현한 클래스의 인스턴스여야 함
    • 정렬의 정의에서 <T> 부분은 실제로는 와일드카드를 사용하고 하한 제한을 걸어둔다. 즉 <T> 부분은 <? super T>로 구현되어 있다.
    • 위와 같이 구현한 이유는 Comparable 인터페이스를 직접 구현하지 않는 클래스( 적어도 간접 구현은 해야 한다. )도 정렬이 가능하게 하기 위한 구현
  • sort 메소드를 호출할 때 Comparator 인스턴스를 기준으로 사용히여 정렬을 진행할 수 있다.
    • ex> Collections.sort(list, Comparator);

 

찾기

  • binarySearch 메소드를 사용해서 찾기를 진행할 수 있다.
    • 정의) public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key);
  • Collenstions 클래스에 정의되어 있고, 찾을 리스트와 찾을 값을 인자로 받아서 값이 리스트에 있다면 해당 인덱스를, 없다면 음의 정수를 반환한다.
  • 이진 탐색을 기반으로 찾기를 진행하기 때문에 정렬이 우선적으로 진행되어야 한다.
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Box");
        list.add("Game");
        list.add("Human");
        list.add("People");
        list.add("Max");
        Collections.sort(list);
        int idx = Collections.binarySearch(list, "Game");
        System.out.println(list.get(idx));
    }

찾기의 결과로 받은 인덱스를 확인

  • 정렬과 동일하게 Comparator 인스턴스를 조건으로 삼고 찾기를 진행할 수 있다.

 

복사

  • Collections 클래스의 copy 메소드를 사용해서 복사를 진행할 수 있다.
    • 정의) public static <T> void copy(List<? super T> dest, List<? extends T> src);
  • 매개변수에 적용된 와일드카드를 통해서 copy 메소드의 대략적인 작동을 유추할 수 있다.
    • List<? super T> dest  :  dest에 T 타입의 인스턴스를 넣는 것만 허용한다.
    • List<? extends T> src  :  src에서 T타입의 인스턴스를 꺼내는 것만 허용한다.

'프로그래밍 > Java' 카테고리의 다른 글

Java - 네스티드(Nested) 클래스  (0) 2020.10.15
Java - 열거형과 가변인자, 어노테이션  (0) 2020.10.14
Java - Collections (1)  (0) 2020.10.09
Java - 제네릭 (2)  (0) 2020.09.27
Java - 제네릭 (1)  (0) 2020.09.22