按降序对int数组进行排序[重复]

Posted

技术标签:

【中文标题】按降序对int数组进行排序[重复]【英文标题】:Sorting int array in descending order [duplicate] 【发布时间】:2011-11-16 21:02:13 【问题描述】:

可能重复:Sort arrays of primitive types in descending orderJava : How to sort an array of floats in reverse order?How do I reverse an int array in Java?

以下代码将按升序顺序对数组进行排序:

int a[] = 30,7,9,20;
Arrays.sort(a);
System.out.println(Arrays.toString(a));

我需要按降序的顺序对其进行排序。我如何使用 Comparator 来做到这一点?

请帮忙。

【问题讨论】:

我刚刚创建了a library for sorting primitive arrays with a custom comparator。第一个“示例用法”是按降序对int[] 进行排序。 排序后按降序遍历数组即可。 【参考方案1】:

对于原始数组类型,您必须编写反向排序算法:

或者,您可以将int[] 转换为Integer[] 并编写一个比较器:

public class IntegerComparator implements Comparator<Integer> 

    @Override
    public int compare(Integer o1, Integer o2) 
        return o2.compareTo(o1);
    

或使用Collections.reverseOrder(),因为它仅适用于非原始数组类型。

最后,

Integer[] a2 = convertPrimitiveArrayToBoxableTypeArray(a1);
Arrays.sort(a2, new IntegerComparator()); // OR
// Arrays.sort(a2, Collections.reverseOrder());

//Unbox the array to primitive type
a1 = convertBoxableTypeArrayToPrimitiveTypeArray(a2);

【讨论】:

convertPrimitiveArrayToBoxableTypeArray(a1) 中的错误 @android,该方法 从不 存在,这是我创建的用于从int[] 转换为Integer[] 的示例。 如果我从 int 转换为 Integer,那么我可以使用 Collections.reverseOrder 但我必须再次转换为 int。这是否有效?我认为在 Aarrays.sort( ) 然后两次转换 @android, Arrays.sort() 没有提供在原始数组类型上使用 Comparator 的工具,因此为什么要进行 2 转换。【参考方案2】:
    Comparator<Integer> comparator = new Comparator<Integer>() 

        @Override
        public int compare(Integer o1, Integer o2) 
            return o2.compareTo(o1);
        
    ;

    // option 1
    Integer[] array = new Integer[]  1, 24, 4, 4, 345 ;
    Arrays.sort(array, comparator);

    // option 2
    int[] array2 = new int[]  1, 24, 4, 4, 345 ;
    List<Integer>list = Ints.asList(array2);
    Collections.sort(list, comparator);
    array2 = Ints.toArray(list);

【讨论】:

看来Ints 类在外部谷歌库中,com.google.common.primitives.Ints【参考方案3】:

Guava 有一个方法Ints.asList() 用于创建由int[] 数组支持的List&lt;Integer&gt;。您可以将其与 Collections.sort 一起使用,以将 Comparator 应用于底层数组。

List<Integer> integersList = Ints.asList(arr);
Collections.sort(integersList, Collections.reverseOrder());

请注意,后者是由实际数组支持的实时列表,因此它应该非常有效。

【讨论】:

是的。我知道。其实我想知道有没有办法使用 Comparator。 @android,没有比较器适用于对象,而不是原语。 我的 Eclipse 在 ArrayUtils 上显示错误 @android 忘记 ArrayUtils,使用 Guava【参考方案4】:

如果不是大/长数组,只需镜像它:

for( int i = 0; i < arr.length/2; ++i ) 
 
  temp = arr[i]; 
  arr[i] = arr[arr.length - i - 1]; 
  arr[arr.length - i - 1] = temp; 

【讨论】:

是的。我知道。其实我想知道有没有办法使用比较器, 不适用于原语。必须实现比较器,因为它是一个接口。 如果您要使用镜像进行 foreach,我认为带有 (int i = array.length - 1; i >= 0; i--) 的负迭代器会简单得多.

以上是关于按降序对int数组进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按降序对数组进行排序的更好方法

按降序对矢量进行排序c ++ [重复]

根据值按降序对 Map<Key,Value> 进行排序 [重复]

按特定键的降序对字典列表进行排序[重复]

如何在Ruby中按降序对数组进行排序

JavaScript按降序排序日期后跟时间[重复]