Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要按多个不同属性对对象的ArrayList排序吗_Java_Comparable - Fatal编程技术网

Java 要按多个不同属性对对象的ArrayList排序吗

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

我有一个叫做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.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);