首页 > 解决方案 > 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));
    }
}

标签: javagenericscomparator

解决方案


推荐阅读