【问题标题】:(Java) Using lambda as comparator in Arrays.sort [duplicate](Java)在 Arrays.sort 中使用 lambda 作为比较器 [重复]
【发布时间】:2020-02-09 13:31:19
【问题描述】:

我正在尝试编写一个带有两个参数的函数,int[] arr1int[] arr2。然后,它应该按照arr2 中给出的顺序对arr1 进行排序。例如,如果arr1[5,7,9,10,7,5] 并且arr2[7,9,10,5],则该函数应该返回[7,7,9,10,5,5],将arr1 排序在arr2 中的元素被索引。

我编写了如下代码,但在 Arrays.sort 中不断出现错误。我想我使用 lambda 不正确。你能指出我做错了什么吗?

public int[] relativeSortArray(int[] arr1, int[] arr2) {

    Map<Integer, Integer> elemToInd = new HashMap<Integer, Integer>();
    for (int i = 0; i < arr2.length; i++) {
        elemToInd.put(arr2[i], i);
    }

    Arrays.sort(arr1, (int n1, int n2) -> elemToInd.get(n1) - elemToInd.get(n2));

    return arr1;
}

【问题讨论】:

  • 只是一个问题:为什么要“复制”已有的排序顺序(即,为什么不直接使用arr2)?
  • 原始类型不能与泛型一起使用
  • @ernest_k 我认为每次比较时通过 arr2 查找每个元素的索引会增加时间复杂度,不是吗?
  • arr2[] 是否总是保存元素的索引?即,总是有 0..N-1 之间的数字(N 是 arr1[] 的大小)并且没有重复?如果是这样的话,创建一个新数组并根据 arr2[] 的索引进行复制很容易
  • @nimrodm arr2 没有重复项,但 arr1 可以有重复项。例如 arr1 [0,0,0,100,100], arr2 [100,0] => 输出 [100,100,0,0,0]

标签: java algorithm dictionary java-8 java-stream


【解决方案1】:

您可以更改arr1 的类型(当然还有返回类型),以便类型符合(与Integer[])并简单地编写:

Arrays.sort(arr1, Comparator.comparing(elemToInd::get));

但是你的所作所为很令人困惑。您不能将泛型与原语一起使用,只需访问 Arrays clas 以获取辅助方法。另一方面,对于集合,您可以在它们上调用 sort 方法。

【讨论】:

    【解决方案2】:
     package java.util;   
     public static <T> void sort(T[] a, Comparator<? super T> c)
    

    你可以看到,当你使用这个方法时,Comparator 类型必须是 super T ,所以 arr 的类型必须使用 Integer

    【讨论】:

      猜你喜欢
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2018-04-28
      • 2012-10-05
      • 2016-07-03
      • 2017-10-28
      • 2021-04-02
      相关资源
      最近更新 更多