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

时间:2015-09-27 17:01:05

标签: java list sorting generics comparable

我需要对List类型的数据进行排序,因此我通过map将其转换为Comparable [],然后进行排序,现在我需要将其转换回T并返回List类型的数据。我试图将它转换为对象,然后转换为T,但它不起作用。任何人都可以帮助PLZ吗? :)

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

1 个答案:

答案 0 :(得分:1)

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

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数组的签名以删除rawtypes(rawtypes是邪恶的,不要使用它们)。

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

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]);
    }
}