如何将 Comparable[] 转换为 List<T>?

How to convert a Comparable[] to a List<T>?

我需要对List类型的数据进行排序,所以通过map转换为Comparable[],然后排序,现在需要转换回T和return类型的数据列表。我尝试将其转换为对象,然后再转换为 T,但没有成功。任何人都可以帮忙吗? :)

@SuppressWarnings("rawtypes")
public static <T> void sort(List<T> data, Function<Object, Comparable> map) {
    Comparable[] a = convertDataToComparable(data, map);
    quickSort(a);
    //convertComparableToData(); //here
}

要在您当前的代码中解决此问题,您需要一个额外的 class,它可以通过映射的比较键进行比较,但也包含原始元素:

private static class ComparableValue<T, K extends Comparable<K>> 
                        implements Comparable<ComparableValue<T, K>> {
    final K sortKey;
    final T origValue;

    public ComparableValue(K value, T origValue) {
        this.sortKey = value;
        this.origValue = origValue;
    }

    @Override
    public int compareTo(ComparableValue<T, K> o) {
        return sortKey.compareTo(o.sortKey);
    }
}

现在您可以执行以下操作:

public static <T, K extends Comparable<K>> void sort(List<T> data, 
                                                     Function<? super T, K> map) {
    @SuppressWarnings("unchecked")
    ComparableValue<T, K>[] a = new ComparableValue[data.size()];
    int i=0;
    for(T element : data) {
        a[i++] = new ComparableValue<>(map.apply(element), element);
    }
    quickSort(a);
    for(i=0; i<a.length; i++) {
        data.set(i, a[i].origValue);
    }
}

请注意,我还修复了您的方法的签名和 a 数组以删除原始类型(原始类型是邪恶的,不要使用它们)。

实际上,整个问题的起因是您的排序方法无法接受自定义比较器。如果支持,事情会简单得多:

public static <T, K extends Comparable<K>> void sort(List<T> data, 
                                                     Function<? super T, K> map) {
    @SuppressWarnings("unchecked")
    T[] array = (T[]) data.toArray();
    // Comparator.comparing appeared in Java-8
    quickSort(array, Comparator.comparing(map));
    for(int i=0; i<array.length; i++) {
        data.set(i, array[i]);
    }
}