【问题标题】:How to convert a Comparable[] to a List<T>?如何将 Comparable[] 转换为 List<T>?
【发布时间】:2015-09-27 17:01:04
【问题描述】:

我需要对List类型的数据进行排序,所以我通过map将其转换为Comparable[],然后排序,现在我需要将其转换回T并返回List类型的数据。我试图将其转换为对象,然后转换为 T,但它没有工作。有人可以帮忙吗? :)

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

【问题讨论】:

  • 为什么不调用 Collections.sort(list, newComparatorBasedOnFunction)?
  • 另外,您没有可让您进行反向转换的函数。甚至可能都不可能。所以你必须那样做。
  • 不要抑制原始类型警告:修复它们。你需要Comparable&lt;?&gt; 而不是Comparable。这是否暗示了您为什么要尝试做一些不明确的事情?
  • 注释中的第一个提示是这里有一些非常错误的地方——你为什么要禁止原始类型警告?几乎没有充分的理由忽略编译器警告。
  • 我不明白你想要做什么:输入T 应该是&lt;T extends Comparable&lt;T&gt;&gt;。另外,贴出所用方法的代码,有助于理解您的需求。

标签: java list sorting generics 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 数组的签名以删除原始类型(原始类型是邪恶的,不要使用它们)。

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

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

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多