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

时间:2009-08-30 17:07:37

标签: java arrays sorting floating-point

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

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

错误:找不到符号

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

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

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

8 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

没有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> T[] toBoxedArray(Class<T> 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;
}

或包含commons lang in your project and use ArrayUtils

之类的内容

答案 3 :(得分:1)

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

将其视为Java自动装箱中的缺陷,如果你愿意的话,它不能将基元数组自动放入等效对象的数组中。

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

同样,在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());

答案 7 :(得分:0)

使用Java 8,您可以使用下面的Steam API -

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

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