2015-09-27 32 views
1

我需要对List类型的数据进行排序,所以我通过map将它转换为Comparable [],然后排序,现在我需要将它转换回T并返回List类型的数据。我试图将它转换为对象,然后转换为T,但它不起作用。任何人都可以帮忙吗? :)如何把Comparable []转换成列表<T>?

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

为什么不调用Collections.sort(list,newComparatorBasedOnFunction)? –

+1

另外,您没有可以进行反向转换的功能。这可能不可能。所以你*有*这样做。 –

+0

不要禁止原始类型的警告:修复他们。你需要'Comparable '而不是'Comparable'。这是否给你提示你为什么试图做一些不明确的事情? –

回答

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]); 
    } 
} 
相关问题