티스토리 뷰

Language/java

컬렉션(Collection) sorted()

혲이. 2021. 5. 26. 00:31
반응형

Java 8에서 추가된 java.util.stream 패키지를 이용하여 컬렉션의 요소를 람다식으로 처리할 수 있다.

 

컬렉션을 sort 하기위해 comparable 인터페이스를 구현하는 클래스를 정의할 필요가 없다! 설령 구현한다고 해도 아래와 같이 간략하게 구현할수 있다..

람다식을 안쓴다면

public class ValueComparator implements Comparator<String> {
   ...
   @Override
   public int compare(String s1, String s2) {
     return map.get(s1).compareTo(map.get(s2));
   }
 }

혹은

Comparator<Integer> compare = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
    return o1 - o2;
}
};

System.out.println(
    compare.compare(1, 2) // -1 
);

이렇게 구현할수있는데 

람다식 이용하면

Comparator<Integer> compare = (Integer o1, Integer o2) -> {
    return o1 - o2
};

혹은

Comparator<Integer> compare2 = (o1, o2) -> o1 - o2;

이렇게 구현할수있다😲

 

 

람다식 이용을 살펴보기전에 OCAJP 예제부터 살펴보자. 

 

예제

Given:
public class Vehicle {
    int vId;
    String vName;
    public Vehicle (int vIdArg, String vNameArg){
        this.vId = vIdArg;
        this.vName = vNameArg;
    }
    public int getVId(){ return vId; }
    public String getVName(){ return vName; }
    public String toString() { 
        return vName;
    }
}​

and the code fragment: 

List<Vehicle> vehicle = Arrays.asList(
    new Vehicle(2, "Car"),
    new Vehicle(3, "Bike"),
    new Vehicle(1, "Truck"));
vehicle.stream()//line n1
        .forEach(System.out::print);​

Which two code fragments, when inserted at line n1 independently, enable the code to print TruckCarBike? 
A. .sorted ((v1, v2) -> v1.getVId() < v2.getVId()) 
B. .sorted (Comparable.comparing (Vehicle: :getVName)).reversed() 
C. .map (v -> v.getVId()).sorted () 
D. .sorted((v1, v2) -> Integer.compare(v1.getVId(), v2.getVid())) 
E. .sorted(Comparator.comparing ((Vehicle v) -> v.getVId())) 

 

 

정답은 D, E이다.

 

A. Boolean값이 return되며 정렬이 불가하다.

B. comparing 메소드는 Comparator 클래스 메소드이고, reversed 메소드 자체가 없다

C. vid만 필터되기 때문에 123순으로 정렬된다. 

D. Integer.compare는 A=B이면 0, A>B이면 1 A<B이면 -1을 리턴한다.

    sorted 안에 사용되었으므로 vid를 기준으로 정렬된다.

E. 정답


사용법

Collections.sorted(Comparator())

sorted메소드에 인자로 Comparator 만 넣어주면된다.

위 예제에서 살펴볼수 있듯이 Bifunction을 이용하거나

(v1, v2) -> Integer.compare(v1.getVId(), v2.getVid()) 

Comparator의 comparing을 이용하여 인자를 넣어주면 된다.

Comparator.comparing ((Vehicle v) -> v.getVId())

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함