如何让 TreeMap 以数组为键工作?

How to make TreeMap work with Arrays as key?

类似问题见:How to make HashMap work with Arrays as key?

但我需要像 ((int key1, int key2) -> String) 这样的 TreeMap,比较 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,我必须写更多

有没有办法为任意长度的数组生成比较器?

带循环的比较器应该可以解决问题。像这样,如果我正确理解你的要求的话。我应该提一下,它假定所有键的长度都相同。

    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;
    });

您可以创建一个工厂方法,它创建一个比较器来比较数组的长度及其值:

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<>(intArrayComparator());

以上比较器有以下情况:

  • 左边比右边大:return 1
  • 左边比右边小:return -1
  • 左侧数组中索引 i 处的项目大于右侧数组中的项目:return 1
  • 左侧数组中索引 i 处的项目小于右侧数组中的项目:return -1
  • 左深等于右深:return 0;

因为 java-9 这可以大大简化:

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