2

Block というクラスがあります (各 Block には x 値と y 値があります)。私はこれらの束を作成し、それらをすべてリストに入れました。リストをx値で並べ替えることができました:

public class Block implements Comparable<Block> {
...
public int compareTo(Block block2){
    return this.x - block2.x;
}

しかし、自由に x 値と y 値の両方でリストをソートできるようにしたいと考えています。これは何とか実行可能ですか?

4

4 に答える 4

4

Comparator次の 2 つのを実装できます。

enum BlockSort implements Comparator<Block> {
    XSORT {
        @Override
        public int compare(Block b1, Block b2) {
            return b1.x - b2.x;
        }
    },

    YSORT {
        @Override
        public int compare(Block b1, Block b2) {
            return b1.y - b2.y;
        }
    }
}

次に、適切なインスタンスXSORT/YSORTを 2 番目の引数として sort メソッドに渡します。例えば:

Collections.sort(blockList, BlockSort.XSORT);

さらに、 by-がインスタンスの自然な順序付けxない場合は、 sをまったく作成しない方が賢明でしょう。BlockBlockComparable

于 2013-08-27T14:49:21.540 に答える
1

@arshajiiの答えと同じようenumに、さまざまなソート方法に を利用できます.コードは以下のとおりです:

public enum BlockSorting implements Comparator<Block> {
    X{
        public int compare(final Block b1, final Block b2){
            return b1.x - b2.x;
        }
    },
    Y{
        public int compare(final Block b1, final Block b2){
            return b1.y - b2.y;
        }
    };
}

この方法を使用する利点は、並べ替え方法を簡単に追加できることです (enum毎回新しい方法を作成する必要はありません)。たとえばBlock、X を使用して のコレクションを並べ替えるには、次のようにします。

Collection<Block> blocks = ....;
Collections.sort(blocks, BlockSorting.X);
于 2013-08-27T14:59:23.843 に答える
0

列挙型を使用したソリューション。

public static enum Order implements Comparator {
     ByX() {
        public int compare(Block b1, Block b2) {
           return b1.x - b2.x;
        }
     },

     ByY() {
        public int compare(Block b1, Block b2) {
           // TODO: Should really use a collator.
           return b1.y - b2.y;
        }
};

それから、あなたはそれを

Collections.sort(blocks, Order.ByX);
于 2013-08-27T14:58:34.633 に答える