Java:如何以相反的顺序对浮点数组进行排序?

我使用以下行以相反的顺序对浮点数组进行排序,但是我收到了错误消息,出了什么问题?

float sortedData[]=new float[100]; ... Arrays.sort(sortedData,Collections.reverseOrder()); 

错误:找不到符号

symbol:方法sort(float [],java.util.Comparator)location:class java.util.Arrays Arrays.sort(sortedData,Collections.reverseOrder());

================================================== =======================

我很困惑因为在Jdk1.6 api中,我看到了这个:[Arrays] public static void sort( float [] a),它没有说:public static void sort( Float [] a)

该特定方法采用Object类型的数组。 float类型不会扩展Object类,但Float会扩展。

 Float sortedData[]=new Float[100]; ... Arrays.sort(sortedData,Collections.reverseOrder()); 

我建议使用Arrays.sort(float[])然后编写一个方法reverse(float[]) (你可能想也可能不想转移NaNs)。

没有Arrays.sort(float[], Comparator)方法; 但是你可以使用或Arrays.asList()或只使用盒装的Float []数组:

 Float[] sortedData = new Float[100]; ... Arrays.sort(sortedData, Collections.reverseOrder()); 

为了封装基本数组,您可以使用以下代码:

 public static Float[] floatArray(float... components) { return toBoxedArray(Float.class, components); } private static  T[] toBoxedArray(Class boxClass, Object components) { final int length = Array.getLength(components); Object res = Array.newInstance(boxClass, length); for (int i = 0; i < length; i++) { Array.set(res, i, Array.get(components, i)); } return (T[]) res; } 

或者在项目中包含类似公共语言的内容并使用ArrayUtils

编译器不是骗你的。 Arrays中没有一个名为“sort”的方法,它接受一个float数组和一个Comparator。 然而,有一种称为“排序”的方法,它采用对象和比较器的数组。 也许如果你在调用sort之前将数组转换为Float数组?

如果你愿意的话,可以把它想象成Java的自动装箱中的缺陷,它不能将基元数组自动放大到等效对象的数组中。

Guava有一个Floats.asList()方法,用于创建一个由float[]数组支持的List 。 您可以将此与Collections.sort一起使用,以将Comparator应用于基础数组。

 List floatList = Floats.asList(arr); Collections.sort(floatList, Collections.reverseOrder()); 

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

其他人解释了原因。 你可以先把它排序然后反转吗?

同样,在for循环中使用自动装箱:

 double[] dbArray = {2.0, 3.0, 4.0, 5.0}; Double[] dBArray = new Double[dbArray.length]; int i = 0; for(Double db : dbArray){ dBArray[i] = db; i++; } Arrays.sort(dBArray, Collections.reverseOrder()); 

使用Java 8,您可以使用如下的Steam API –

(没有FloatStream和直接mapToFloat方法,但你总是可以使用double)

 float[] unsorted = new float[100]; .... List sorted = IntStream.range(0, unsorted.length).mapToDouble(i->unsorted[i]).boxed().sorted(Collections.reverseOrder()).collect(Collectors.toList()); 
  1. 使用盒装方法将原语转换为对象类型的代码。
  2. Collections.reverseOrder()以相反的顺序帮助排序。
  3. 最后收集它到列表,在这里你也可以使用其他类型。