【问题标题】:Java : How to sort an array of floats in reverse order?Java:如何以相反的顺序对浮点数组进行排序?
【发布时间】:2023-04-09 18:40:02
【问题描述】:

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

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)

【问题讨论】:

    标签: java arrays sorting floating-point


    【解决方案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());
          

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

          【讨论】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-08-12
              • 1970-01-01
              • 1970-01-01
              • 2022-01-07
              相关资源
              最近更新 更多