Java中的比较器,使用不同的字段

时间:2017-10-28 02:38:41

标签: java collections comparator

是否可以从Java中的方法调用比较器?我有以下代码片段,我应该编写一个具有addComparator方法的类,我假设它必须以某种方式添加Comparator。代码是(它不是完整版,我只是想了解我应该做什么以及如何实现它):

 ComparatorChain chain = new ComparatorChain();
 chain.addComparator(new sortByTitle());
 chain.addComparator(new sortByDirector());
 Collections.sort(library.getItem(),chain);

有人可以告诉我如何实现这一点。 感谢。

1 个答案:

答案 0 :(得分:0)

假设你有:

class ComparatorChain implements Comparator<TypeToBeSorted> {....};
class SortByTitle     implements Comparator<TypeToBeSorted> {....};
class SortByDirector  implements Comparator<TypeToBeSorted> {....};

ComparatorChain有两个对象,如:

private SortByTitle sortByTitle;
private SortByDirector sortByDirector;

ComparatorChain可以实现:

public int compare(TypeToBeSorted o1, TypeToBeSorted o2) {
    int comByTitle = (sortByTitle == null ) ? 0 : sortByTitle.compare(o1, o2);
    int comByDirector = (sortByDirector == null ) ? 0 : sortByDirector.compare(o1, o2);
    //add logic 
    return ......;
}

chain.addComparator(new sortByTitle());应初始化sortByTitle

void addComparator(SortByTitle sortByTitle) { this.sortByTitle = sortByTitle; }

chain.addComparator(new sortByDirector());应初始化sortByDirector。  您可以使用instanceof

使用一种方法来执行这两种操作 @LeonardBrünings评论之后

编辑:上述答案不应被视为正确的实施,而是更多的尝试回答

  

有人可以给我一个提示吗

用一些简单的东西开始。
您可以在ComparatorChain中使用更加动态的通用且灵活的实现:

List<Comparator<TypeToBeSorted>> comperatorList  = new ArrayList<>(); //or better use generics

按所需顺序添加比较器
void addComparator(Comparator<TypeToBeSorted> comperator) { comperatorList.add(comperator); }

使用comperatorList元素实现实现compare