首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何组合多个比较器?

如何组合多个比较器?
EN

Stack Overflow用户
提问于 2018-07-25 02:58:20
回答 2查看 3K关注 0票数 1

我在这里的第一个帖子问题,请温文点:)

我正在尝试在Java中创建一个基于各种标准进行排序的比较器。主类是非常基本的,它有几个变量作为排序的基础。

例如,一个"Book“类,它具有:

  • 页码,
  • 标题,
  • 每页平均字数。

下面是我得到的“介绍”:

编写一个ComplexComperator,它可以基于多个变量进行排序。创建2个构造函数:

一个有两个参数

 public ComplexComparator(Comparator<Book> x, Comparator<Book> y)

如果两个项目基于第一个参数相等,则它基于第二个参数进行排序,

另一个有4个参数

 public ComplexComparator(Comparator<Book> x, boolean h, Comparator<Book> y, boolean i)

如果逻辑变量为真,它会根据比较器按自然顺序对其进行排序-因此它的工作方式与双参数构造函数相同。如果其中一个逻辑变量采用false值,它将颠倒自然顺序。

所以,就是这样。我写了简单的比较器,但我不知道如何处理这个。我不知道compare方法应该是什么样子;或者即使我必须添加某种类型的类变量...谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-25 03:10:09

1.如何使用

您可以在ComplexComparator类中添加Comparator<Book>,您只需检查构造函数中条件的不同可能性:

public class ComplexComparator implements Comparator<Book>{

    private Comparator<Book> comp;

    public ComplexComparator(Comparator<Book> x, Comparator<Book> y) {
        comp = x.thenComparing(y);
    }

    public ComplexComparator(Comparator<Book> x, boolean h, Comparator<Book> y, boolean i) {
        if (h && i) {
            comp = x.thenComparing(y);
        } else if (h) {
            comp = x.thenComparing(y.reversed());
        } else if (i) {
            comp = x.reversed().thenComparing(y);
        } else {
            comp = x.reversed().thenComparing(y.reversed());
        }
    }

    @Override
    public int compare(Book o1, Book o2) {
        return comp.compare(o1, o2);
    }
}

2.如何创建

如果您拥有正确的getters,则可以将其用作

public static void main(String[] args) {
    Comparator<Book> page = Comparator.comparing(Book::getPageNb);
    Comparator<Book> title = Comparator.comparing(Book::getTitle);

    ComplexComparator c1 = new ComplexComparator(page, title);
    ComplexComparator c2 = new ComplexComparator(page, true, title, false);
}

3.如何使用

票数 5
EN

Stack Overflow用户

发布于 2021-10-13 15:58:13

public static void main(String[] args) {
    Comparator<Book> page = Comparator.comparing(Book::getPageNb);
    Comparator<Book> title = Comparator.comparing(Book::getTitle);

    // you dont need a combining "complex" class - 
    // just compose using .thenCompare() and/or 
    // .reversed() as required e.g.:

    Comparator complex1 = page.thenComparing(title);
    Comparator complex2 = page.reversed().thenComparing(title);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51505777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档