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

可能重复:
Sort arrays of primitive types in descending order
Java : 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 来做到这一点?

请帮忙。

【问题讨论】:

标签: java arrays sorting


【解决方案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--) 的负迭代器会简单得多.
猜你喜欢
  • 2020-03-06
  • 2014-02-16
  • 2020-07-18
  • 2018-05-26
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多