【问题标题】:is it possible to create a generic method that will sort arrays and linked lists equally?是否可以创建一个对数组和链表进行同等排序的通用方法?
【发布时间】:2014-04-01 02:11:36
【问题描述】:

我正在处理一项需要构建对链表或数组进行排序的通用 Java 方法的任务,但我不明白这怎么可能。

【问题讨论】:

  • 不,重载方法。
  • 不,这真的做不到,因为没有共同的数组和集合超类(当然除了 Object)。我想你可以让你的方法以Object 作为参数,并使用instanceof 来检测它实际上是什么;但重载方法会更好。

标签: java arrays sorting generics linked-list


【解决方案1】:

LinkedList 排序实现应该与迭代器一起工作以提高效率,因为没有迭代器的索引和交换元素将花费线性时间。因此,LinkedList 和数组(或ArrayList)的通用排序没有多大意义。

如果您想编写一个通用的ArrayList 和数组排序,例如,您可以提供两个 lambdas 的实现,用于获取和设置某个索引处的元素:

private static interface Get<E> {
    E get(int index);
}

private static interface Set<E> {
    void set(int index, E e);
}

private static <E extends Comparable<? super E>> void sort(
        Get<E> get, Set<E> set, int size) {
    // ... sorting algorithm
}

public static <E extends Comparable<? super E>> void sort(E[] array) {
    // more verbose syntax if you use Java 7, but it shouldn't affect performance
    sort(i -> array[i], (i, e) -> { array[i] = e; }, array.length);
}

public static <E extends Comparable<? super E>, T extends List<E> & RandomAccess>
sort(T arrayList) {
    sort(arrayList::get, arrayList::set, arrayList.size());
}

我没有测量,但这种实现不应该比旧的简单方法慢很多(如果有的话),因为 JIT 能够无缝内联 lambda。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多