我有一个名为 Block 的类(每个 Block 都有一个 x 值和 ay 值)。我已经创建了一堆这些并将它们全部放在一个列表中。我设法按 x 值对列表进行了排序:
public class Block implements Comparable<Block> {
...
public int compareTo(Block block2){
return this.x - block2.x;
}
但我希望能够在闲暇时按 x 和 y 值对列表进行排序。这在某种程度上可行吗?
我有一个名为 Block 的类(每个 Block 都有一个 x 值和 ay 值)。我已经创建了一堆这些并将它们全部放在一个列表中。我设法按 x 值对列表进行了排序:
public class Block implements Comparable<Block> {
...
public int compareTo(Block block2){
return this.x - block2.x;
}
但我希望能够在闲暇时按 x 和 y 值对列表进行排序。这在某种程度上可行吗?
您可以实现两个Comparator
s:
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
可能更明智。Block
Comparable
您可以使用 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());
就像@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);
使用枚举的解决方案;
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);