簡體   English   中英

Java:如何以相反的順序對浮點數組進行排序?

[英]Java : How to sort an array of floats in reverse order?

我使用以下行以相反的順序對浮點數組進行排序,但是我收到了一條錯誤消息,出了什么問題?

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)

該特定方法采用Object類型的數組。 float類型不會擴展Object類,但Float會擴展。

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

我建議使用Arrays.sort(float[])然后編寫一個reverse(float[])方法reverse(float[]) (你可能想也可能不想轉移NaNs)。

沒有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這樣的東西並使用ArrayUtils

編譯器不是騙你的。 Arrays中沒有一個名為“sort”的方法,它接受一個float數組和一個Comparator。 但是,有一種稱為“排序”的方法,它采用對象和比較器的數組。 也許如果在調用sort之前將數組轉換為Float數組?

可以把它想象成Java自動裝箱中的缺陷,如果你願意的話,它不能將基元數組自動放入等效對象的數組中。

Guava有一個Floats.asList()方法,用於創建一個由float[]數組支持的List<Float> 您可以將它與Collections.sort一起使用,以將Comparator應用於基礎數組。

List<Float> 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和直接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. 最后收集它到列表,在這里你也可以使用其他類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM