2017-06-04 1 views
0

私はいくつかの配列があります。最良の方法は、

trade_prices[n] 
trade_volumes[n] 
trade_dates[n] 
trade_tickers[n] 

を、私はtickersによって、その後datesによってそれらをソートしたいです。

どのように並べ替えることができますか?

+0

forループで行うことができます。しかし:1-私はそれが最善の方法であるかどうか(正確に)と2がわからない。 –

+0

これは、2つのforループによって次々と実行できます。お互いに2つのループの代わりに。私は、日付と時間でそれを日付で並べ替えることができます。 –

答えて

8

デザインを再考する必要があるようです。私はこれらのプロパティのクラスを作成し、クラス型のコレクションを持つことが優れていると思う:

class Trade 
{ 
    double price; 
    double volume; 
    Date date; 
    String tickers; 
} 

その後Comparatorインタフェースを実装ソートします。例では、あなたが作成した後、クラスは次のようになります。saka1029で述べたようにHow to sort by two fields in Java?

別のオプションは、クラスのオブジェクトの蒸気にComparator.comparingComparator.thenComparingComparator's functionsを使用することです。

+1

@Mohammad_Hosein - これで問題を解決できましたか? –

+0

こんにちは、私はそれに取り組んでいます。私はJavaで(そしてプログラミングでも)新しいので時間がかかります –

0

コンストラクタとメソッドを含むクラスを作成し、配列をグローバルとして宣言します。配列をソートする関数を書くことができます。

3

このように内部クラスTradeを定義します。

int n = 10; 
int[] trade_prices = new int[n]; 
int[] trade_volumes = new int[n]; 
Date[] trade_dates = new Date[n]; 
String[] trade_tickers = new String[n]; 
// fill data... 
class Trade { 
    final int i; 
    Trade(int i) { this.i = i; } 
    int price() { return trade_prices[i]; } 
    int volume() { return trade_volumes[i]; } 
    Date date() { return trade_dates[i]; } 
    String ticker() { return trade_tickers[i]; } 
} 
Trade[] trades = IntStream.range(0, n) 
    .mapToObj(Trade::new) 
    .sorted(Comparator.comparing(Trade::ticker).thenComparing(Trade::date)) 
    .toArray(Trade[]::new); 

次に、最初の価格はtrades[0].price()とソートされています。 元の配列は変更されません。

+1

'Comparator.comparing'の使用はいいですが、インデックスとヌルをチェックせずに外部配列にアクセスするためのクラスの実装は非常に悪い習慣ですIMO –