为任何可比较的集合(Java)编写排序方法

时间:2014-02-11 04:24:14

标签: java sorting collections

这是我在Stack Overflow上的第一篇文章。如果有什么我可以做的改进它:请分享。

我正在尝试了解不同的排序算法(例如插入,选择,冒泡,合并,快速,存储桶,基数,堆,shell,gnome和bogo排序)并使用Java实现它们。

我怎么能编写一个sort方法,它可以用于实现Collection的任何类的Comparable的任何类?我查看了Collections.sort()的{​​{3}},它在方法签名中有一些我不明白的语法。

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    Object[] a = list.toArray();
    Arrays.sort(a);
    ListIterator<T> i = list.listIterator();
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }
}

以下是我对如何编写SortNone方法的最佳(可悲)猜测,该方法不对Collection进行排序,但具有正确的方法标题。我会将其称为SortNone.sort(myCollection),其中myCollection是实现Collection的类实现Comparable的任何类的实例(假设事先导入com.tenembasj.sort.*,请参阅更多信息)。

package com.tenembasj.sort;

public class SortNone {

    public static<T> void sort(Collection<E> collection) { //don't know how to require the object (is it T or E?) to implement Comparable
        //code to sort
        //would I have to use collection.size(), .get(i), .set(i), and such to edit the class implementing Collection?
    }
}

此外,我想添加一个sort方法,为Comparator添加一个参数,我只需要知道形式参数是什么。一旦我知道如何编写常规sort,我想我可以弄清楚实现。

同样,我正在尝试编写自己的排序方法,而不是使用Collections.sort()Arrays.sort()或任何Java.util方法。你可能会说“不要重新发明轮子”,但我只是想学习。

更多信息

我想在完成后将这些方法导出到jar中,并在将来的项目中将它们导入为库。我创建了一个新项目(在Eclipse中),创建了一个名为com.tenembasj.sort的包,并将添加诸如MergeSort之类的类。我相信这是标准的命名约定,但如果不是,请告诉我。我的目标是能够在以后的任何项目中输入import com.tenembasj.sort.*,并致电MergeSort.sort(myCollection);MergeSort.sort(myCollection, myComparator);

1 个答案:

答案 0 :(得分:1)

我怎样才能编写一个sort方法,它可以用于实现实现Comparable的任何类的Collection的任何类?

为了编写可以应用于所有类型对象的函数,您必须编写一个通用代码,例如您在Collections.sort()源上面发布的代码。

假设您是初学者,最好的起点是向generic学习并一次吃掉大象。


我将尝试解释您上面发布的代码。

T表示通用

中的任何类型

extends Comparable<? super T>表示T必须是Comparable对象。它可以是Object类型,它扩展了Comparable接口或包含类似接口的任何对象。

sort(List<T> list)表示sort函数可以接受List类型的T个对象作为参数。

public static <T extends Comparable<? super T>> void sort(List<T> list) {

//  Copying the values from the List of objects to an array.
    Object[] a = list.toArray();

//  Applying the array.sort operation.
    Arrays.sort(a);

//  Setting the values from the sorted array to the listi of type T. 
    ListIterator<T> i = list.listIterator();
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }
}

首先学习generic