【问题标题】:java comparator for arrays sort [duplicate]数组排序的java比较器[重复]
【发布时间】:2017-02-14 12:19:31
【问题描述】:

我的代码如下所示:

public class Solution {
    public void nextPermutation(int[] nums) {
        int k = 0;
        for(int i = nums.length -1; i> 0 ;i--){
            if(nums[i-1] < nums[i]){
                k = i-1;
                break;
            }
        }
        if( k == 0) {Arrays.sort(nums); return;}
        int tmp = nums[k];
        nums[k] = nums[nums.length - 1];
        nums[nums.length-1] = tmp;
        Arrays.sort(nums,k+1,nums.length,new Comparator<Integer>(){
            public int compare(Integer a, Integer b){
                return b - a;
            }
        });
    }    
}

我想使用比较器对数组进行降序排序,但它总是显示

第 14 行:错误:没有找到适合 sort(int[],int,int, 匿名比较器)

谁能指出问题出在哪里?非常感谢!

【问题讨论】:

  • @cricket_007 ...这是怎么复制的?这个问题询问编译器错误,询问如何加速算法,两者的答案肯定不一样。
  • @QPaysTaxes 错误是因为试图对原语进行排序,是吗?
  • @cricket_007 这不是重复的标准。查看您链接的问题的答案 - 他们是否直接回答问题?当然,你可以得到 an 答案,但关键问题 - intInteger 不是同一类型,ints 不能在泛型方法中使用all -- 没有解决
  • @QPaysTaxes 这个呢?这也被标记到另一个帖子。 Sort int array in descending order
  • @cricket_007 那是明确询问“我如何对整数进行排序?”。这个人在问“我有应该执行某些任务的代码,但是我遇到了编译器错误。为什么?”任务发生是对整数进行排序这一事实并不意味着什么。再次,查看您提出的副本的答案。他们是否回答了所提出的问题——即“问题出在哪里?”不。他们为手头的任务提供了一个(n 替代)解决方案,这很有用,但不是问题的答案。

标签: java arrays comparator


【解决方案1】:

没有任何方法可以像int[] nums 这样采用原始 数组并按降序对其进行排序。有些采用对象数组,例如sort(T[] a, Comparator&lt;? super T&gt; c) - 但原语不是Objects1

最直接的方法可能是简单地将sort(int[] input) 你的数组按升序排列,然后reverse 得到结果数组。排序可能比反向花费的时间要长得多,因此这种方法应该表现良好。或者,您可以修改消费代码,使其按升序处理数组,或者您可以将数组包装在 List 中,然后使用反向视图。

还有lots of other options


1 原则上,您可以通过装箱每个底层int 元素将int[] 转换为Integer[],但您会付出很大的性能损失和巨大的内存(将使用的内存增加约 10 倍)和垃圾惩罚。

【讨论】:

    【解决方案2】:

    您的数组是int 类型,比较器泛型类型是Integer。将您的数组类型更改为整数,一切都会好起来的,如下所示:

    public void nextPermutation(Integer[] nums) {...

    【讨论】:

    • 为了使用这种方法,将整个数组转换为装箱的 Integer 对象会付出可怕的性能和内存损失!
    • 确实如此,在我的帖子上编辑一下,我会添加它。
    • 我不确定您所说的“放置编辑”是什么意思...
    【解决方案3】:

    您的nums 数组必须是Integer 类型。

    【讨论】:

      【解决方案4】:

      采用ComparatorArrays.sort 重载只能作用于对象数组; int 不是泛型类型参数的有效替换。

      所以,

      Integer[] intObjs = ...;
      int[] intPrimitives = ...;
      Arrays.sort(intObjs, start, end, someComparator); //OK
      Arrays.sort(intPrimitives, start, end, someComparator); //fails
      

      对于您想要工作的内容,必须声明一个 Arrays.sort 重载以采用 int[] - 但这是一种昂贵的排序,因为它基本上需要装箱 ints每次比较。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-02
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多