Java 要按多个不同属性对对象的ArrayList排序吗
我有一个叫做Block的类(每个Block有一个x值和一个y值)。我已经创建了一系列这些,并将它们全部放在一个列表中。我已成功按x值对列表进行排序:Java 要按多个不同属性对对象的ArrayList排序吗,java,comparable,Java,Comparable,我有一个叫做Block的类(每个Block有一个x值和一个y值)。我已经创建了一系列这些,并将它们全部放在一个列表中。我已成功按x值对列表进行排序: public class Block implements Comparable<Block> { ... public int compareTo(Block block2){ return this.x - block2.x; } public类块实现了可比较的{ ... 公共内部比较(区块2){ 返回此.x-block2
public class Block implements Comparable<Block> {
...
public int compareTo(Block block2){
return this.x - block2.x;
}
public类块实现了可比较的{
...
公共内部比较(区块2){
返回此.x-block2.x;
}
但我希望能够在空闲时按x和y值对列表进行排序。这是否可行?您可以使用2来实现这一点
public class XComparator implements COmparator<Block>{
public int compare(T o1, T o2){
...
}
}
您可以实现两个功能:
此外,如果by-x
不是块
实例的自然顺序,那么最好不要让块
s具有可比性
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);
与@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;
}
};
}
当涉及x和y值时,排序条件是什么?使用比较器
而不是默认的比较器(方法)
(当然还有使用比较器的正确排序
方法)为什么有两个独立的enum
s?@JoshM我们只需要一个XSort
/YSort
实例,这样我们就可以使它们成为enum
s,其中instance
是一个实例。或者你是说我们可以把它们都放在一个enum
中?我想的是一个enum
。请看我的答案呃,虽然我认为JNL在这方面胜过了我。:(我只是在更新我的答案,以使用单个enum
+1)。
Collections.sort(blockList, BlockSort.XSORT);
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);
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;
}
};
}
Collection<Block> blocks = ....;
Collections.sort(blocks, BlockSorting.X);