Java:如何按相反顺序对浮点数组排序?

Java:如何按相反顺序对浮点数组排序?,java,arrays,sorting,floating-point,Java,Arrays,Sorting,Floating Point,我使用以下几行按相反的顺序对浮点数组进行排序,但我收到一条错误消息,怎么了 float sortedData[]=new float[100]; ... Arrays.sort(sortedData,Collections.reverseOrder()); 错误:找不到符号 符号:方法排序(float[],java.util.Comparator) 位置:类java.util.Arrays sort(sortedData,Collections.reverseOrder()) ======

我使用以下几行按相反的顺序对浮点数组进行排序,但我收到一条错误消息,怎么了

float sortedData[]=new float[100];
  ...
Arrays.sort(sortedData,Collections.reverseOrder());
错误:找不到符号

符号:方法排序(float[],java.util.Comparator) 位置:类java.util.Arrays sort(sortedData,Collections.reverseOrder())

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


我很困惑,因为在Jdk1.6API中,我看到了:[Arrays]公共静态无效排序(float[]a),它没有说:公共静态无效排序(float[]a)

编译器没有骗你。数组中没有一个称为“sort”的方法可以接受浮点数组和比较器。然而,有一种称为“sort”的方法,它接受一个对象数组和一个比较器。如果在调用sort之前将数组转换为Float数组,可能会发生这种情况


如果您愿意的话,可以将其视为Java自动装箱中的一个缺陷,即它无法将原语数组自动装箱到等价对象数组中。

没有
数组。sort(float[],Comparator)
方法;但是,您可以使用或
数组。asList()
或仅使用盒装浮点[]数组:

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;
}
publicstaticfloat[]floatArray(Float…组件){
返回toBoxedArray(Float.class,components);
}
私有静态T[]ToboxDarray(类boxClass,对象组件){
最终int-length=Array.getLength(组件);
Object res=Array.newInstance(boxClass,长度);
for(int i=0;i
或者包含类似于

的内容,该内容特定于对象类型的数组。类型float不扩展对象类,但扩展对象类


我建议使用
array.sort(float[])
,然后编写一个方法
reverse(float[])
(您可能希望也可能不希望将NaN移位)。

其他人已经解释了原因。您能先对其排序,然后将其反转吗?

有一种方法,可以创建一个
列表
,该列表由
浮点[]
数组支持。您可以将其与Collections.sort一起使用,以将比较器应用于基础数组

List<Float> floatList = Floats.asList(arr);
Collections.sort(floatList, Collections.reverseOrder());
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和direct mapToFloat方法,但始终可以使用double)

float[]未排序=新浮点[100];
....
List sorted=IntStream.range(0,unsorted.length).mapToDouble(i->unsorted[i]).boxed().sorted(Collections.reverseOrder()).collect(Collectors.toList());
  • 使用装箱方法将原语转换为对象类型的代码
  • Collections.reverseOrder()有助于按相反顺序排序
  • 最后将其收集到列表中,在这里您还可以使用其他类型

  • Arrays.asList
    on
    float[]
    无法正常工作(如您所料)!(而且我真的不喜欢反射。)(也不喜欢零长度数组的类型检查。)请随意更改代码;这只是一个示例,因为“真实”需要使用来自公共lang-1的ArraysUtils来依赖装箱和反射。只要对数组进行正常排序,然后将其反转,就更容易、性能更好了。如果您使用的是
    float
    s,那么您这样做可能是出于性能原因。@Tom Hawtin,几乎不是在2009年?只有当你处理了很多浮动,我的意思是很多。floats.asList()links给出了404。也许你可以用
    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());
    
    float[] unsorted = new float[100];
    ....
    List<Double> sorted = IntStream.range(0, unsorted.length).mapToDouble(i->unsorted[i]).boxed().sorted(Collections.reverseOrder()).collect(Collectors.toList());