按降序对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<Integer>
。您可以将其与 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数组进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章