如何使TreeMap与数组一起使用?

时间:2017-12-29 07:47:14

标签: java arrays lambda java-8 treemap

类似的问题请参阅: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时,我必须写更多。

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

3 个答案:

答案 0 :(得分:10)

从java-9开始,这可以通过以下方式大大简化:

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

答案 1 :(得分:6)

带循环的比较器应该可以解决问题。如果我理解你的要求,那就是这样的。我应该提到它假设所有键都具有相同的长度。

    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)

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

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

以上比较器有以下情况:

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