如何将 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]);
}
}
我需要对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]);
}
}