2

我有一个名为 Block 的类(每个 Block 都有一个 x 值和 ay 值)。我已经创建了一堆这些并将它们全部放在一个列表中。我设法按 x 值对列表进行了排序:

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

但我希望能够在闲暇时按 x 和 y 值对列表进行排序。这在某种程度上可行吗?

4

4 回答 4

4

您可以实现两个Comparators:

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作为第二个参数传递给 sort 方法。例如:

Collections.sort(blockList, BlockSort.XSORT);

此外,如果 by-x不是实例的自然顺序,那么根本不创建sBlock可能更明智。BlockComparable

于 2013-08-27T14:49:21.540 回答
2

您可以使用 2 个比较器来实现这一点。

public class XComparator implements COmparator<Block>{
  public int compare(T o1, T o2){
    ...
  }
}

和 :

public class YComparator implements COmparator<Block>{
  public int compare(T o1, T o2){
    ...
  }
}

然后使用其中之一进行排序:

Collections.sort(list, new XComparator());
Collections.sort(list, new YComparator());
于 2013-08-27T14:48:50.400 回答
1

就像@arshajii 的答案一样,您可以将 anenum用于各种不同的排序方法,代码如下所示:

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 对 s 的集合进行排序,您可以执行以下操作:

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 回答