如何组合多个比较器?
How to combine multiple Comparator?
我的第一个 post 问题,请温柔点:)
我正在尝试在 Java 中创建一个根据各种标准进行排序的比较器。 Main class 是非常基本的,它有几个排序所基于的变量。
例如,"Book" class,其中有:
- 页码,
- 标题,
- 每页平均字数。
这是 "intructions" 我得到的:
写一个ComplexComperator,它可以根据多个变量进行排序。创建 2 个构造函数:
一个有 2 个参数
public ComplexComparator(Comparator<Book> x, Comparator<Book> y)
如果根据第一个参数两个项目相等,则根据第二个参数排序,
另一个有 4 个参数
public ComplexComparator(Comparator<Book> x, boolean h, Comparator<Book> y, boolean i)
如果逻辑变量为真,它会根据该比较器按自然顺序对其进行排序 - 因此它的工作方式与 2 参数构造函数相同。如果其中一个逻辑变量取假值,它将颠倒自然顺序。
所以,就是这样。我写了简单的比较器,但我不知道如何处理这个。我不知道比较方法应该是什么样子;或者即使我必须添加某种 class 变量...谢谢您的帮助!
1.怎么做
您可以在 ComplexComparator
class 中添加一个 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。使用方法
Full Workable Demo
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);
}
我的第一个 post 问题,请温柔点:)
我正在尝试在 Java 中创建一个根据各种标准进行排序的比较器。 Main class 是非常基本的,它有几个排序所基于的变量。
例如,"Book" class,其中有:
- 页码,
- 标题,
- 每页平均字数。
这是 "intructions" 我得到的:
写一个ComplexComperator,它可以根据多个变量进行排序。创建 2 个构造函数:
一个有 2 个参数
public ComplexComparator(Comparator<Book> x, Comparator<Book> y)
如果根据第一个参数两个项目相等,则根据第二个参数排序,
另一个有 4 个参数
public ComplexComparator(Comparator<Book> x, boolean h, Comparator<Book> y, boolean i)
如果逻辑变量为真,它会根据该比较器按自然顺序对其进行排序 - 因此它的工作方式与 2 参数构造函数相同。如果其中一个逻辑变量取假值,它将颠倒自然顺序。
所以,就是这样。我写了简单的比较器,但我不知道如何处理这个。我不知道比较方法应该是什么样子;或者即使我必须添加某种 class 变量...谢谢您的帮助!
1.怎么做
您可以在 ComplexComparator
class 中添加一个 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。使用方法
Full Workable Demo
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);
}