2013-08-27 109 views
2

我有这个类叫做Block(每个Block有一个x值和一个y值)。我创建了一堆这些,并把它们放在一个列表中。我已经成功通过x值对列表进行排序:想要通过几个不同的属性对对象ArrayList进行排序

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

但我希望能够通过这两个X,并用我的休闲y值对列表进行排序。这是可行的吗?

+0

什么是涉及x和y值的排序条件? – codeMan

+1

使用'Comparator '而不是默认的'compareTo(method)'(当然还有使用'Comparator '的'sort'方法) – SJuan76

回答

4

可以实现两个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作为排序方法的第二个参数。例如:

Collections.sort(blockList, BlockSort.XSORT); 

此外,如果副xBlock的的自然排序的情况下,它可能会是明智的没有使Block小号Comparable可言。

+0

为什么有两个独立的'enum's? –

+0

@JoshM我们只需要一个'XSort' /'YSort'的实例,所以我们可以让它们成为'enum's,其中'INSTANCE'就是这个单一实例。或者你是否说我们可以把它们放在单个'enum'中? – arshajii

+0

我在想单个'enum'。看到我的回答,尽管我认为JNL打败了我。 :( –

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

我只是更新我的答案,使用单个'enum'。+1无论如何 – arshajii

+0

是的,我想:P –

相关问题