2016-03-29 23 views
0

整数の配列を高い順にソートしようとしています。逆順で配列をソートする - 逆順でない

int[] array = {2, 6, 4, 1};  
Arrays.sort(array); 
Collections.reverse(Arrays.asList(array)); 
for (int num : array) { 
    System.out.println(num); 
} 

これは、昇順 - 1, 2, 4, 6で配列を出力します。なぜそれが元に戻されないのですか、または配列がその逆の状態で永続的に保存されないのはなぜですか?

+0

。このリストを保存してから、配列に変換して戻すことはできますか?または、配列の並べ替えを簡単に戻す方法はありますか? – KOB

答えて

2

最も「簡単」ソリューションはCollectionsクラスで提供さreverseComperatorを使用することです。これにより、自動的に降順で配列がソートされます。

public static void main(String[] args) { 
    // Use the Wrapper class, otherwise you can´t call Arrays.sort with a comperator. 
    Integer[] array = {2, 6, 4, 1}; 
    Arrays.sort(array, Collections.reverseOrder()); 
    for (int num : array) { 
     System.out.println(num); 
    } 
} 

なぜソリューションが機能しないのか。
Arrays.asList(array)で一時的にリストを作成します。これは逆になり、後でもう一度参照されません。これは、array変数の順序を変更しません。

0

リストを逆順に並べた結果ではなく、配列をソートした結果が表示されます。一時的な変数にソートされたリストを格納し、それを逆にしてから、必要な動作を得るためにtoArrayを呼び出す必要があります。

逆の順序でソートするより簡単な方法は、実行することです。

Arrays.sort(array, (o1,o2)-> Integer.compare(o2,o1)); 
0

コードにはいくつかの問題があります。Arrays.asListは新しいList<Integer>を作成しませんが、実際にはList<int[]>です。しかし、たとえそれが期待どおりに機能したとしても、返されるリストは一時的なオブジェクトに過ぎず、まだ配列を出力しています。

残念ながら、正しい解決策は非常にエレガントではありません:私は理解して

int[] array = {2, 6, 4, 1};  
Arrays.sort(array); 
List<Integer> asList = new ArrayList<Integer>(); 
for(int i : array) { 
    asList.add(i); 
} 
Collections.reverse(asList); 
for (int num : asList) { 
    System.out.println(num); 
}