2009-08-30 12 views
4

フロートの配列を逆順にソートするには、次の行を使用しますが、エラーメッセージが表示されます。何が問題なのですか?Java:浮動小数点配列を逆順にソートする方法は?

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

エラー:シンボルを見つけることができない

シンボル:メソッドソート(フロート[]はjava.util.Comparator) 場所:クラスjava.util.Arrays は、Arrays.sort(sortedData、Collections.reverseOrder ());

============================================== [配列]のpublic static:JDK1.6 APIでは、私はこれを見たので===========================

私は混乱していました空のソート(フロート [] a)は、それは言っていない:公共の静的な無効ソート(フロートは [] a)は

答えて

3

具体的にはmethodで、Object型の配列をとります。 float型はObjectクラスを拡張しませんが、Floatは拡張します。

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

'float'sを使用している場合は、おそらくパフォーマンス上の理由があります。 –

+0

@Tom Hawtin、ほとんど2009年ですか?あなたがたくさんの浮動小数点を扱う場合にのみ、私は多くのことを意味します。 – crunchdog

1

コンパイラはあなたに嘘をついていません。配列にfloatとComparatorの配列をとる「ソート」と呼ばれるメソッドはありません。しかし、オブジェクトの配列とコンパレータをとる「ソート」と呼ばれるメソッドがあります。配列を配列の配列に変換してからsortと呼ぶのであれば?あなたがする場合

は、それが同等のオブジェクトの配列にプリミティブの配列をAutoBoxのないことを、Javaのオートボクシングの欠陥と考えてください。

2

ないArrays.sort(float[], Comparator)方法は存在しません。しかし、あなたが使用したり、Arrays.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; 
} 

またはcommons lang in your project and use ArrayUtils

のようなものが含まれます
+1

'浮動小数点[]'の 'Arrays.asList'は期待通りに動作しません! –

+0

(そして私は本当に反映されません) –

+0

(長さゼロの配列の型チェックもしません) –

3

私はArrays.sort(float[])を使用して、(あなたがまたは周りNaNをシフトしたくない場合もあります)メソッドreverse(float[])を書くことをお勧めします。

0

その他の理由が説明されています。あなたはそれを最初に並べ替えることができますか?

1

Guavaは、float[]アレイに裏打ちされたを作成する方法Floats.asList()を持っています。これをCollections.sortとともに使用して、コンパレータを基本配列に適用することができます。

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

リストは実際の配列に裏打ちされたライブビューなので、かなり効率的であることに注意してください。

+0

Floats.asList()リンクには404が表示されます。https://github.com/google/guava/blob/master/guava/src/com/google/common/primitives/Floats.javaを使用することができます。 –

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()); 
0

をJavaの8を使用すると、以下のようなスチームのAPIを利用することができます -

(無FloatStreamと直接mapToFloat方法はありませんが、あなたは、常にタイプをobjectにプリミティブ変換に箱入りの方法を使用して)

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. 最後にリストにまとめて、ここで他のタイプも使用できます。
関連する問題