1

オブジェクトの配列があります。各オブジェクトが Grid 型であるとしましょう。

各 Grid オブジェクトには x 座標と y 座標があり、

Grid temp = new Grid(3, 5);
// temp.x returns x, temp.y returns y.

今、私はグリッドのいくつかの配列を持っています

Grid[] theArray1 = new Grid[5];
Grid[] theArray2 = new Grid[5];
Grid[] theArray3 = new Grid[5];

配列に Grid オブジェクトを入力し、Arrays.sort を使用して並べ替えます。

次に、ソートされた配列を結合して、長さが 5+5+5=15 の配列を形成します。

「サブアレイ」の最初の要素 (theArray の要素 0、5、および 10) で theArray を並べ替えたいと思います。

どうすればこれを達成できますか?また、同じ結果を達成するためのより簡単な方法があれば、それは素晴らしいことです。しかし、for ループの反復によって取得されるため、3 つの配列から始める必要があります。

編集:

例: X 座標で並べ替え、小さい方から並べるとします。簡単にするために、各 Grid[] の長さを 5 ではなく 3 にします。

Grid[] theArray1 = new Grid[]{new Grid(2, 1), new Grid(4, 1), new Grid(0, 1)};
Grid[] theArray2 = new Grid[]{new Grid(4, 2), new Grid(3, 1), new Grid(7, 1)};
Grid[] theArray3 = new Grid[]{new Grid(1, 7), new Grid(5, 3), new Grid(10, 1)};

私が最終的にしたいのは、印刷すると次のように印刷される配列/配列リストです。

for (int i = 0; i <= theArray.length-2; i++) {
    StdOut.println(theArray[i] + ", " + theArray[i+1] + ", " + theArray[i+2] + "\n");
}

// Output:

(0, 1), (2, 1), (4, 1) //this is theArray1
(1, 7), (5, 3), (10, 1) //this is theArray3
(3, 1), (4, 2), (7, 1) //this is theArray2

最初に、各 theArray(1、2、および 3) を並べ替えて、x 座標が最小の要素が最初に、次に 2 番目に小さく、次に最大になるようにします。

次に、これらの配列をそれぞれの最初の要素のサイズで並べます。最初の要素の x 座標は 1 ですが、theArray2 では 3 であるため、theArray3 は theArray2 の前に配置されます。

4

5 に答える 5

1

3 つの個別の配列ではなく、2 次元配列を作成できます。次に、最初に2次元配列を並べ替えて、それらを互いに関連する順序で取得してから、それらを結合できます。

    Grid[][] twoD;

    /* ... */

    // sort each array separately
    for(int i=0; i<twoD.length; i++){
        Arrays.sort(twoD[i], /* COMPARATOR */);
    }

    // sort the arrays based on x coordinate of first element
    Arrays.sort(twoD, new Comparator<Grid[]>() {
        public int compare(Grid[] a, Grid[] b) {
            return Integer.compare(a[0].x, b[0].x);
        }
    });

    /* NOW JOIN THEM */

ただし、文字通り3つの配列しかない場合は、どれが最小かを確認し、それを最初に追加するなどできます.

于 2013-09-24T21:05:31.763 に答える
0

並べ替えられた配列を結合すると、サイズ 15 の新しい配列が作成されます。新しい配列には値が追加されますが、サブ配列とは関係がありません。したがって、並べ替えを適用すると、配列全体になります。並べ替える必要がある場合は、サイズ 5 の別の配列変数を使用し、それを並べ替えてから、メイン配列に書き戻す必要があります。

于 2013-09-24T21:00:39.867 に答える
0

あなたは Comparable を使うことができます、多分これは役に立ちます..

import java.util.Arrays;

public class Grid implements Comparable<Grid> {

    public static void main(String[] args) {
        Grid a = new Grid( 2, 15 ); // 3
        Grid b = new Grid( 1, 1 ); // 2
        Grid c = new Grid( 0, -13 ); // 1
        Grid d = new Grid( 4, 0 ); // 4

        Grid gridArray[] = new Grid[] { a, b, c, d };
        System.out.println( "Printing non sorted:" );
        for ( Grid grid : gridArray ) {
            System.out.println( grid.getX() + ", " + grid.getY() );
        }
        System.out.println( "Sorting..." );
        Arrays.sort( gridArray );

        System.out.println( "Printing sorted:" );
        for ( Grid grid : gridArray ) {
            System.out.println( grid.getX() + ", " + grid.getY() );
        }
    }

    private int x, y;

    public Grid(int x, int y) {
        this.setX( x );
        this.setY( y );
    }

    @Override
    public int compareTo(Grid grid) {
        // ascending order
        return this.getX() - grid.getX();
        // descending order
        // return grid.getX()-this.getX();
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

}

Arrays.sort は自然順序付け (Comparable) を使用するようになりました。 http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#sort(java.lang.Object[]) を参照してください。

これは、指定された main メソッドを実行した後の出力です。

Printing non sorted:
2, 15
1, 1
0, -13
4, 0
Sorting...
Printing sorted:
0, -13
1, 1
2, 15
4, 0
于 2013-09-24T21:02:00.723 に答える