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