首页 文章

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

提问于
浏览
4

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

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

错误:找不到符号

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

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

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

8 回答

  • 0

    没有 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的内容

  • 1

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

    可以把它想象成Java自动装箱中的缺陷,如果你愿意的话,它不能将基元数组自动放入等效对象的数组中 .

  • 3

    具体的method,采用Object类型的数组 . float类型不会扩展Object类,但Float会扩展 .

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

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

  • 1

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

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

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

  • 3

    其他人解释了原因 . 你可以先排序然后反转吗?

  • 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());
    
  • 2

    使用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()以相反的顺序帮助排序 .

    • 最后收集它到列表,在这里你也可以使用其他类型 .

相关问题