我需要对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
}
答案 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]);
}
}