2017-12-29 71 views
5

비슷한 질문을 참조하십시오 : How to make HashMap work with Arrays as key?배열을 키로 TreeMap을 작동시키는 방법?

하지만 ((int key1, int key2) -> String) 같은 트리 맵이 필요하고 key1을 비교 key2을 비교.

내 솔루션은 다음과 같습니다

Map<int[], String> map = new TreeMap<>(Comparator. 
      <int[]>comparingInt(key -> key[0]).thenComparingInt(key -> key[1])); 

을하지만 ((int key1, int key2, int key3) -> String을 필요로 할 때, 나는 더 작성해야합니다.

임의 길이의 배열에 대한 Comparator를 생성하는 방법이 있습니까?

+1

아마 가장 좋은 방법은 바로 정확히을하는'Comparator'를 작성하는 것입니다. 나는 그것이 합리적이고 이해할 수있게 lambdas와 함께 할 수 있을지 의심 스럽다. 당신이 람다와 그것을 할 수 있다면, 그것을 위해 가야하지만, 개인적으로 나는 단지 정규 자바를 사용하고 싶다. – Obicere

답변

6

루프가있는 비교기가 트릭을 수행해야합니다. 당신의 요구 사항을 정확하게 이해한다면 이것과 같은 것입니다. 나는 모든 키가 같은 길이라고 가정한다고 언급해야한다. 다음 다음 당신은 같이 부를 수

public static Comparator<int[]> intArrayComparator(){ 
    return (left, right) -> { 
     int comparedLength = Integer.compare(left.length, right.length); 
     if(comparedLength == 0){ 
      for(int i = 0; i < left.length; i++){ 
       int comparedValue = Integer.compare(left[i], right[i]); 
       if(comparedValue != 0){ 
        return comparedValue; 
       } 
      } 
      return 0; 
     } else { 
      return comparedLength; 
     } 
    }; 
} 

:

Map<int[], String> treeMap = new TreeMap<>((o1, o2) -> { 
     for (int i = 0; i < o1.length; i++) { 
      if (o1[i] > o2[i]) { 
       return 1; 
      } else if (o1[i] < o2[i]) { 
       return -1; 
      } 
     } 

     return 0; 
    }); 
+2

먼저 길이를 확인하십시오. 길이가 동일하면 루프를 입력하십시오. 그렇지 않으면 +1. – Obicere

+0

좋은 지적 - 나는 그것을 게시 한 것으로 나타났습니다. 가정을 나타 내기 위해 원래의 대답을 업데이트했습니다. –

+3

@ Obicere 이렇게하면 대칭 요구 사항을 벗어납니다. 첫 번째 배열이 더 길다면'+ 1'을, 그렇지 않으면 (-1)을 반환해야한다. – talex

1

당신은 배열의 길이와 그 값을 비교하는 비교기를 생성하는 팩토리 메소드를 만들 수

Map<int[], String> treeMap = new TreeMap<>(intArrayComparator()); 

위의 비교기는 다음과 같은 경우가 있습니다 :

  • 왼쪽 오른쪽보다 큰 : 1
  • 왼쪽 오른쪽보다 작은를 반환 : 왼쪽 배열의 인덱스 난에 -1
  • 항목을 반환 오른쪽 배열에서보다 더 큰 : 인덱스 1
  • 항목을 반환 전 왼쪽 배열의 배열은 오른쪽 배열의 배열보다 작습니다. return -1
  • 왼쪽은 오른쪽과 같음 : return 0;
10

자바-9이 크게 단순화 할 수 있기 때문에 :

TreeMap<int[], String> map = new TreeMap<>(Arrays::compare);