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());
Arrays.asList
onfloat[]
无法正常工作(如您所料)!(而且我真的不喜欢反射。)(也不喜欢零长度数组的类型检查。)请随意更改代码;这只是一个示例,因为“真实”需要使用来自公共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());