2016-07-05 1 views
1

두 번째 열에서 비교자를 사용하여 두 개의 열을 가진 배열을 정렬하고 순서를 반전하려고합니다.반전 된 비교기를 사용하여 스트림으로 배열 정렬

String[][] names = {{"a", "1234"}, {"b", "12312"}, {"c", "43"}}; 

그리고 내가 사용하는 정렬 된 배열 반환 :

배열은

String[][] out = Arrays.stream(names) 
    .sorted(
     Comparator.comparing(x -> x[1]) 
    ) 
    .toArray(String[][]::new); 

잘 작동하지만 reversed()를 사용하여 정렬 순서를 reverese하려고하면

String[][] out = Arrays.stream(names) 
    .sorted(
     Comparator.comparing(x -> x[1]).reversed() 
    ) 
    .toArray(String[][]::new); 

나는 오류 :

Error:(44, 66) java: array required, but java.lang.Object found 

그리고 내 IDE는 x[1] 부분에 X을 강조한다. 내가 뭘 잘못하고있어?

+0

손실 될 : 이들은 모두 같은, 단지 더 많은 명시가되는 것은 있습니까? 나는 또한 ['reverseOrder()'] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#reverseOrder--)와 체인 된 ['comparison ()'] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function-java.util.Comparator-)는 다음없이 올바르게 작동합니다. 모든 유형 지정. [Ideone Demo] (https://ideone.com/bGu4V3) – Kaushal28

답변

3

.reversed() 체인 호출을 추가하면 컴파일러에서 generic 형식 매개 변수를 comparing()으로 추론 할 수 없으므로 명시 적으로 지정해야합니다.

첫째, 당신은 comparing()의 전체 선언을 알고 있어야합니다 :

static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor) 

그것은 두 가지 유형의 매개 변수가 있습니다

  • T - 기능 (람다)의 입력, 즉 String[]을 귀하의 경우에
  • U - 귀하의 경우 함수의 반환 값은 String입니다.
그래서 당신이 쓸 수 있습니다 :

Comparator.<String[], String>comparing(x -> x[1]).reversed() 

을 양자 택일로, 당신은 당신의 람다의 매개 변수 유형을 지정할 수 있습니다 (즉, T) 컴파일러는 U을 유추합니다.

Comparator.comparing((String[] x) -> x[1]).reversed() 

아마도 그렇게하고 싶을 것입니다.


원한다면 첫 번째로 할 수도 있습니다.

Comparator.comparing(x -> x[1]) 
Comparator.comparing((String[] x) -> x[1]) 
Comparator.<String[], String>comparing(x -> x[1]) 
Comparator.<String[], String>comparing((String[] x) -> x[1]) 
는 일반 타입 추론의 원인은 무엇
+0

을 정렬 한 후 배열을 역 – 4castle

+1

자바 언어 사양의 유추 규칙을 잘 살펴 봐야합니다. 아마도이 시나리오에 대해서도 추측 할 수 있도록 Java의 향후 버전에서 수정하게 될 것입니다. 그러나 그때까지는 그 방법 일뿐입니다. 그것이 유추하면 위대합니다. 그렇지 않은 경우 여기에 표시된대로 명시 적 유형을 추가하십시오. – Andreas

+2

@ 4castle :'reverseOrder()'와'comparisoring()'을 연계하는 것은 후자가'정적'메소드이기 때문에 의미가 없으므로 전자는 전혀 영향을 미치지 않습니다. 작동은 * 중첩 * 즉 Collections.reverseOrder (Comparator.comparing (x -> x [1]))'입니다. 형식 추론은 언어 디자이너가 결과 복잡성을 두려워하여 체인 메소드 호출을 통해 작동하지 않습니다. 일반 유형은 호출 할 오버로드 된 메소드에 영향을 줄 수 있으며 추론 된 일반 유형에 영향을 줄 수 있습니다. – Holger