4

現在、3つの情報配列があり、値の1つに基づいてそれらを並べ替える方法がわかりません。

int[] rank = { 1, 3, 4, 2, 5 };
String[] game = { "Snake", "Mines", "Fragged", "Siege", "Tower" };
int[] year = { 1980, 1983, 1981, 1995, 1992 };

ランクで並べ替えたいのですが、コンパレータを使って2つの並列配列を並べ替える例はたくさんありますが、2つ以上並べ替える例は見たことがありません。

私の最初の考えは、それぞれに変数を持つクラスを作成してから、そのオブジェクトを並べ替えることでしたが、並べ替えには追加のクラスが本当に必要ですか?

4

3 に答える 3

10

私の最初の考えは、それぞれに変数を持つクラスを作成してから、そのオブジェクトを並べ替えることでしたが、並べ替えには追加のクラスが本当に必要ですか?

厳密に必要というわけではありません。本当に必要な場合は、それを回避するためのコードを確実に作成できます。しかし、それは完全に良いことだと思います。

ここには、実際には3つの個別のアイテムのコレクションはありません。1つのアイテムのコレクションがあり、それぞれに3つのプロパティがあります。したがって、コードをそれに一致させます。a[0]に関連するb[0]などの並列コレクションがある場合は常に、c[0]その情報を別のクラスにカプセル化することを検討する必要があります。これにより、コードの保守がはるかに簡単になり、一貫性が高まります。

たとえば、これらの配列の長さが異なることは意味がありません。しかし、それを停止する宣言には固有のものはありません。コレクションが1つある場合、コレクションが1つしかないという理由だけで、プロパティごとにアイテムの数を変えることはできません。

于 2012-11-19T19:37:55.307 に答える
3

新しいクラスを作成することが最もクリーンなソリューションになると思います。最初の配列(ランク)にスワップを適用するたびに、他の2つの配列にスワップを複製する新しい並べ替え関数を手動で実装できますが、それはすぐに面倒になります。

次のようなものが必要なすべてです:

public class Game implements Comparable<Game>{
    private int rank = 0;
    private int year = 0;
    private String name = "";
    ...
    // Constructor +
    // Usual getters and setters here
    ..
    public int compareTo(Game anotherGame) {
       return this.rank - anotherGame.getRank();
    }
}

そして、あなたは簡単に行うことができます:

List<Game> games = new ArrayList<Game>();
...
// Add some games to your games list
...
Collections.sort(games);
于 2012-11-19T19:40:18.170 に答える
2

追加のクラスは必要ですか?いいえ、もちろん違います。すべての一貫性を保つソートルーチンを思い付くことができます。ただし、来週、パブリッシャーなどの4番目のアレイが必要であると判断した場合はどうなりますか?これで、並べ替えルーチンが機能しなくなり、新しいルーチンを作成する必要があります。

代わりに、これらのフィールドをプロパティとして保持するクラスを作成すると、並べ替えロジックを大幅に簡素化でき、さらに1つの配列についてのみ心配する必要があります。現在行っている余分な作業はすぐに回収され、次回このコードを維持する必要があります。

于 2012-11-19T19:51:25.327 に答える