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

Posted

技术标签:

【中文标题】Java:如何以相反的顺序对浮点数组进行排序?【英文标题】:Java : How to sort an array of floats in reverse order? 【发布时间】:2010-11-24 04:04:30 【问题描述】:

我使用以下行对浮点数数组进行倒序排序,但收到错误消息,怎么了?

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

错误:找不到符号

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案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的内容

【讨论】:

Arrays.asList on float[] 不会工作(如你所料)! (我真的不会去反思。) (也不会对零长度数组进行类型检查。) 随意更改代码;这只是一个示例,对于“真实”需求,请使用 common lang 中的 ArraysUtils -1 用于依赖拳击和反射。对数组进行正常排序然后反转它更容易,性能更好。【参考方案3】:

那个特定的method,采用对象类型的数组。 float 类型不扩展 Object 类,但 Float 可以。

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

【讨论】:

如果您使用floats,您可能有这样做的性能原因。 @Tom Hawtin,2009 年几乎没有?只有当你玩很多花车时,我的意思是很多。【参考方案4】:

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

【讨论】:

【参考方案5】:

其他人已经解释了原因。能不能先排序再反转?

【讨论】:

【参考方案6】:

Guava 有一个方法Floats.asList() 用于创建由float[] 数组支持的List&lt;Float&gt;。您可以将其与 Collections.sort 一起使用,以将 Comparator 应用于底层数组。

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

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

【讨论】:

Floats.asList() 链接给出 404。也许你可以使用github.com/google/guava/blob/master/guava/src/com/google/common/…【参考方案7】:

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

【讨论】:

【参考方案8】:

使用 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());
    使用装箱方法将基元类型转换为对象类型的代码。 Collections.reverseOrder() 有助于反向排序。 最后收集到列表,这里你也可以使用其他类型。

【讨论】:

以上是关于Java:如何以相反的顺序对浮点数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

使用浮点 NumPy 数组进行比较和相关操作

如何按升序对这个浮点数值列表进行排序?

如何在python中对具有浮点值的列表进行排序? [复制]

如何在不消除坐标的情况下对浮点坐标进行排序? [关闭]

如何使用extjs4.1在网格中按降序对带有连字符的浮点值进行排序

Java泛型详解