2012-03-03 21 views
0

私は3つの配列を持っています。そのうちの1つは文字列配列であり、2つはint配列です。複数配列の並べ替え

ここでは、1つを並べ替えるときにすべてを並べ替える必要があります。例えば

:私が欲しいもの

String[] stringarr = {"a", "z", "b"}; 
int[] intarra = {5, 8, 2}; 
int[] intarrb = {0, 7, 1}; 

がintarraによってそれらを並べ替えることです。

私は

intarra == {2, 5, 8}; 

を返しますが、どのように私は

stringarr == {"b", "a", "z"}; 
intarrb == {1, 0, 7}; 

それとも私が店に何か他のものを使用する必要がありますように、他の配列をソートするに行くか

Arrays.sort(intarra); 

を使用することができます

データ?

文字列配列はイベントタイトルで、int配列はイベントの時刻です。

+1

実際にデータを保存する方法を変更する必要があります。 3つの属性を持つMyEventクラスを作成し、MyEventオブジェクトを1つの配列に格納するのはなぜですか?この配列を並べ替えるには、基本的なカスタムコンパレータを実装します。 –

答えて

1

あなたの配列(配列のリスト、配列の配列または配列のvar argのリスト)を取得するメソッドを記述し、最初にソートすると、他の配列の要素のインデックスも変更される必要があります。

+0

なぜdownvote ...? – dantuch

+0

最初の配列をソートすると、ソートされた最初の配列になります。他の配列をどのように並べ替えるかは、OPが求めているものであり、あなたはそれに答えませんでした。 – yurib

2

これはOOPを使用すると簡単です。データを含む構造体を作成し、ソート方法を指定します。

public class MyStructure implements Comparable 
{ 
    public String string; 
    public int int1; 
    public int int2; 

    public int compareTo(Object obj) 
    { 
      if (obj instanceof MyStructure) 
      { 
       return ((MyStructure) obj.int1) - int1; 
      } 
      return 0; 
    } 

} 

これらの構造体の配列を作成し、その配列をソートします。

+0

intフィールドでソートしたい場合はどうなりますか? – ManojGumber

+0

** **はintフィールドでソートしています... –

+0

私は、Comparableを使用すると、その特定のフィールドでのみソートすることになります。しかし、現在のユースケースでは、3つのフィールドのいずれかを並べ替えることができます。 – ManojGumber

0

Javaでは、3つの別々の配列を維持するのではなく、オブジェクトのリストを作成し、Collections.sort()を使用してオブジェクトをソートします(ユースケースで可能かどうかはわかりません)。したがって、すべてのプロパティは常に同期します。あなたのオブジェクトがComparableインタフェースを実装する必要があり、したがって、あなたはcompareTo()方法

public class MySortable implements Comparable { 
    private String strVal; 
    private int intVala; 
    private int intValb; 

    public int compareTo(MySortable other) { 
     // Use Integer's compareTo method instead of writing your own logic 
     return Integer.valueof(intVala).compareTo(Integer.valueOf(other.intVala)); 
    } 
} 
0

を上書きすることを余儀なくされ、あなたが言及した3 fielsをカプセル化するクラスを作成します。その後

class MyClass{ 
String input: 
int a; 
int b; 
} 

あなたがその場で比較すると、あなたにソートされた配列を与える適切なコンパレータを作成し、文字列または整数値でソートする場合によって異なります。

ArrayList<MyClass> a; 
Collections.sort(a, new Comparator<MyClass> { 
int compareTo(MyClass a, MyClass b){ 
a.getInt1()-b.getInt2(); 
} 

コンパレータを使用する利点は、使用例に応じて、スティングと整数の両方をソートできることです。

0

「私はデータを保存するために別のものを使用すべきですか?

はい、そうです。次の3つすべてを格納する新しいクラスを作成することをお勧めします。

今すぐ配列。ソートはあなたのために動作します:

TimedEvent[] eventArray = new TimedEvent[5000]; 
// lots of events get stored. 
eventArray[0] = new TimeEvent("Start", 125,134); 
eventArray[1] = new TimeEvent("FireClose", 128,139); 
eventArray[2] = new TimeEvent("Important Action", 1328,1339); 

Arrays.sort(eventArray) 

(注)初期化しない配列の任意の要素がnullになり、あなたが並べ替えしようとすると、これは例外をスローすること。配列の長さが必要なだけ正確であることを確認してください。事前に格納するイベントの数がわからない場合は、代わりにArrayListを使用してください。

ArrayList<TimedEvent> eventList = new ArrayList<>(); //java7 syntax. use       
           // new ArrayList<TimedEvent>(); if using Java 6. 
// lots of events get stored. 
eventList.add(new TimeEvent("Start", 125,134)); 
eventList.add(new TimeEvent("FireClose", 128,139)); 
eventList.add(new TimeEvent("Important Action", 1328,1339)); 

Collections.sort(eventList); 
+0

私はこれを働かせようとしていますが、私はどのようにイベントアレイにイベントを設定しますか? 私はTimedEvet.title = eventtitle などを使用しました しかし、私はすべてnullを取得します。 – Jixi

+0

更新の回答を見てください。オブジェクトを作成してフィールドを設定する必要があります。ですから、私が書いたコンストラクタを使うか、デフォルトのコンストラクタを作成し、次にTimedEventを書きます。te = new TimedEvent(); te.title = "固定"; – Thorn

関連する問題