2018-5-7 TIL 컬렉션프레임워크 정렬

Sorting

public static <T> void sort(List<T> list, Comparator<? super T> C) : 매개변수c를 대상으로하는 T형 인스턴스를 넣는 메소드만 호출가능

package yoon;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

class Car {
    protected int disp;
    public Car(int d) { disp = d; };

    @Override
    public String toString() { return "cc:" + disp; };
}

class CarComp implements Comparable<Car> {

    @Override
    public int compare(Car o1, Car o2) { return o1.disp - o2.disp; }

    @Override
    public int compareTo(Car o) {
        return 0;
    }
}

class ECar extends Car {
    private int battery;

    public ECar(int d, int b) {
        super(d);
        battery = b;
    }

    @Override
    public String toString() { return "cc: " + disp + ", ba : " + battery; }
}

class CarComparator {
    public static void main(String[] args) {
        List<Car> clist = new ArrayList<>();
        clist.add(new Car(1800));
        clist.add(new Car(1200));
        clist.add(new Car(3000));

        List<ECar> elist = new ArrayList<>();
        elist.add(new ECar(3000, 55));
        elist.add(new ECar(1800, 87));
        elist.add(new ECar(1200, 99));

        CarComp comp = new CarComp();

        // 각각정렬
        Collections.sort(clist, comp);
        Collections.sort(elist, comp);

        for (Iterator<Car> itr= clist.iterator(); itr.hasNext(); )
            System.out.println(itr.next().toString() + "\t");
        System.out.println();

        for (Iterator<ECar> itr = elist.iterator(); itr.hasNext(); )
            System.out.println(itr.next().toString() + "\t");
        System.out.println();
    }
}
//result
cc: 1200
cc:	1800
cc:	3000

cc:	1200,	ba:	99
cc:	1800,	ba:	87
cc:	3000,	ba:	55

찾기

리스트 자료구조를 기반으로 특정 인스턴스를 찾을 때,

public static <T> int binarySearch(List<? extedns Comparable<? super T» list, T key) : list에서 key를 찾아 그 인덱스값을 반환, 못찾으면 음의 정수 반환

위의 메소드를 좀 더 간결하게 해보자

public static <T> int binarySearch(List<?> list, T key) : 첫번쨰 인자로는 List<E> 인스턴스는 무엇이든 올 수 있다.

첫번째 인자로 List<E> 인스턴스는 무엇이든 올 수 있다. 단 이때 E는 Comparable<T>를 구현해야한다.

찾기 : Comparator<T>기반

package yoon;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class StringBinarySearch {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Box");
        list.add("Robot");
        list.add("Apple");
        Collections.sort(list); // 정렬
        int idx = Collections.binarySearch(list, "Robot");
        System.out.println(list.get(idx)); // 탐색결과를 출력
    }
}
//result
robot
  • public int compareToIgnoreCase(String str) : 두 문자열이 같을 때 0을 반환. 실제로 대소문자의 구분없이 진해잉 된다.

복사하기

public static <T> void copy(List<? super T> dest, List<? extends T> src) : src의 내용을 dest로 복사

Q. List<T>가 아닌 List<? super T> dest인 이유는 ? dest에 T형 인스턴스를 넣는 것만 허용하겠다. 꺼내면 컴파일 에러

Q. src가 아닌 List<? extends T> src인 이유는 ? src로부터 T형 인스턴스 꺼내는 것만 허용하겠다.

package yoon;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class CopyList {
    public static void main(String[] args) {
        List<String> src = Arrays.asList("Box", "Apple", "Toy", "Robot");

        // 복사본을 만든다.
        List<String> dest = new ArrayList<>(src);

        // 정렬하고 그리고 출력
        Collections.sort(dest);
        System.out.println(dest);

        // dest에 저장된 내용을 src에 저장된 내용으로 덮어씀
        Collections.copy(dest, src);

        // 되돌림 확인
        System.out.println(dest);
    }
}
//result
[Apple, Box, Robot, Toy]
[Box, Apple, Toy, Robot]

List<String> dest = new ArrayList<>(src) : 컬렉션 인스턴스를 생성하지 않은 상태에서 복사본을 만들때 사용을 한다.

Written on May 7, 2018