这是我在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);
。
答案 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