java - Java :: 使用泛型实例化“运行时”多比较器
问题描述
我有一个 MultiComparator 类,它允许一个组合多种排序。例如,下面的代码为联系人创建排序。
// This works
contactList.sort(
new MultiComparator<>(
new ContactComparator(ContactComparator.Sort.CONTACT_NAME),
new ContactComparator(ContactComparator.Sort.ID)
)
);
但是,我需要在运行时动态创建排序顺序,并且我无法弄清楚如何执行此操作,因为 java 编译器不断给我一个错误:“无法推断参数(无法解析构造函数)”。为简单起见,我省略了创建排序字段的“有序”列表的逻辑,但假设用户可以创建订单。我的问题变成了,如何在给定这个有序列表的情况下创建 MultiComparator。有任何想法吗?
List<ContactComparator> orderedContactComparators = new ArrayList(); // assume this was created above
contactList.sort(
// compiler error: "Cannot infer arguments (unable to resolve constructor)
new MultiComparator<>(orderedContactComparators)
);
作为参考,其他类如下...
ContactComparator 类
public class ContactComparator implements Comparator<Contact> {
private Sort currentSort;
private boolean sortAsc;
public enum Sort {
NAME, ADDRESS, ID
}
public ContactComparator() {
currentSort = Sort.NAME;
sortAsc = true;
}
public ContactComparator(Sort sort) {
currentSort = Objects.requireNonNullElse(sort, Sort.NAME);
sortAsc = true;
}
@Override
public int compare(Contact o1, Contact o2){
// Compare logic here
}
}
多比较器类
public class MultiComparator<T> implements Comparator<T> {
private List<Comparator<? super T>> comparators;
public MultiComparator(List<Comparator<? super T>> comparators) {
this.comparators = comparators;
}
@SafeVarargs
public MultiComparator(Comparator<? super T>... comparators) {
this(Arrays.asList(comparators));
}
public int compare(T o1, T o2) {
for (Comparator<? super T> c : comparators) {
int result = c.compare(o1, o2);
if (result != 0) {
return result;
}
}
return ObjectUtils.compare(o1.hashCode(), o2.hashCode());
}
@SafeVarargs
public static <T> void sort(List<T> list, Comparator<? super T>... comparators) {
list.sort(new MultiComparator<T>(comparators));
}
}
解决方案
推荐阅读
- javascript - 如何为菜单项添加背景颜色?
- apostrophe-cms - 如何在 ApostropheCMS 中自定义管理栏?
- c# - 我可以在不使用 FormFlow 的情况下列出枚举的值吗?
- java - 获取 java.lang.ArrayStoreException:sun.reflect.annotation.TypeNotPresentExceptionProxy
- vue.js - 无法通过我的方法访问数据
- android - Workmanager FCM 依赖项
- redis - REDIS:EXPIRE 是否有事件
- swift - 如何将 Delegate 转换为 Observable RxSwift?
- php - 可以在用户表中添加 foried 密钥 user_id 吗?
- javascript - React.js 映射如何更改单个元素