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());
【讨论】:
如果您使用float
s,您可能有这样做的性能原因。
@Tom Hawtin,2009 年几乎没有?只有当你玩很多花车时,我的意思是很多。【参考方案4】:
我建议使用Arrays.sort(float[])
,然后编写一个方法reverse(float[])
(你可能想也可能不想改变NaN)。
【讨论】:
【参考方案5】:其他人已经解释了原因。能不能先排序再反转?
【讨论】:
【参考方案6】:Guava 有一个方法Floats.asList()
用于创建由float[]
数组支持的List<Float>
。您可以将其与 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:如何以相反的顺序对浮点数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章