为了解决这个问题在当前的代码,你需要一个额外的类,这是由映射的比较关键的可比性,而是保持原有的元素以及:
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]);
}
}
为什么不调用Collections.sort(list,newComparatorBasedOnFunction)? –
另外,您没有可以进行反向转换的功能。这可能不可能。所以你*有*这样做。 –
不要禁止原始类型的警告:修复他们。你需要'Comparable >'而不是'Comparable'。这是否给你提示你为什么试图做一些不明确的事情? –