【问题标题】:How to make TreeMap work with Arrays as key?如何使 TreeMap 以数组为键工作?
【发布时间】:2017-12-29 07:47:14
【问题描述】:

类似问题见: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) -&gt; String时,我必须写更多。

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

【问题讨论】:

  • 可能最好的方法就是写一个Comparator 来做到这一点。我怀疑这可以用 lambdas 合理且可以理解地完成。如果你可以用 lambda 来做,那就去吧,但我个人只会使用普通的 Java。

标签: java arrays lambda java-8 treemap


【解决方案1】:

由于 java-9,这可以大大简化:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 一定要先检查长度。仅当长度相等时才进入循环。否则,+1。
    • 好点 - 我在发布时注意到了这一点。我更新了原始答案以表明假设。
    • @Obicere 如果你这样做,你会打破对称性要求。如果第一个数组更长,则应返回+1,否则应返回-1(或相反,取决于您想要的)。
    • @talex 完全正确。我个人也会这样做。只需Integer.compareTo(o1.length, o2.length)
    【解决方案3】:

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

    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 处的项大于右侧数组中的项:返回 1
    • 左侧数组中索引 i 处的项小于右侧数组中的项:返回 -1
    • 左深等于右:return 0;

    【讨论】:

      猜你喜欢
      • 2013-03-12
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 2022-10-18
      • 1970-01-01
      • 2017-04-22
      • 2017-04-10
      相关资源
      最近更新 更多