想要按几个不同的属性对对象的ArrayList进行排序

时间:2013-08-27 14:46:55

标签: java comparable

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

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

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

4 个答案:

答案 0 :(得分:4)

您可以实施两个Comparator

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);

此外,如果 - x不是Block个实例的自然排序,则可能更明智的做法是Block s {{ 1}}。

答案 1 :(得分:2)

您可以使用2 Comparators来实现此目标。

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());

答案 2 :(得分: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)。例如,要使用X对Block s的集合进行排序,您可以执行以下操作:

Collection<Block> blocks = ....;
Collections.sort(blocks, BlockSorting.X);

答案 3 :(得分:0)

使用Enums的解决方案;

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);