【发布时间】:2013-10-05 17:52:01
【问题描述】:
我知道有内置的例程,但作为一个学习者,我想使用自己的设备进行排序,而且由于排序是旧帽子,我决定尝试制作自己的通用排序例程如果我弄清楚它们在 Java 中是如何工作的,我可以使用数字或字符串,甚至日期。
这就是我所拥有的,直到现在我只在两个地方(包含在“**”标记内)有错误,需要弄清楚如何比较。
package sort;
import java.util.ArrayList;
public abstract class Sort<E> implements Comparable<E> {
public void swap(ArrayList<E> a, int i, int j) {
E c = a.get(i);
a.set(i,a.get(j));// = a[j];
a.set(j, c);
}
public void bubbleSort(ArrayList<E> a) {
boolean inOrder = false;
while (!inOrder) {
inOrder = true;
for (int i = 1; i < a.size(); i++) {
**if( a.get(i - 1).compareTo(a.get(i)) > 0 )** {
//cannot find symbol: method compareTo(E); location: class Object
//where E is a type-variable: E extends Object declared in class Sort
inOrder = false;
swap(a, i, i - 1);
}
}
}
}
public static void main(String args[]) //hadda lose 'static' for 'setLayout' to work
{
ArrayList<Integer> ary = new ArrayList<>();
ary.add(2); ary.add(4); ary.add(7); ary.add(3);
**bubbleSort(ary)**;
//method bubbleSort in class Sort<E> cannot be applied to given types;
//required: ArrayList<E>
//found: ArrayList<Integer>
//reason: actual argument ArrayList<Integer> cannot be converted to ArrayList<E>
//by method invocation conversion where E is a type-variable:
//E extends Object declared in class Sort
for (int i = 0; i < ary.size(); i++) {
System.out.println(ary.get(i));
}
}
@Override
public int compareTo(E o) {
**return 0;** // fixing errors above may help this fall into place
}
}
我正在尝试学习我感觉准备好的东西,却发现我还没有完全准备好;关闭,无雪茄。
【问题讨论】:
-
我可以建议,作为一个学习者,你学习的排序算法比冒泡排序更好吗?
-
另外,如果
bubbleSort()是一个实例方法,你可能想要new Sort<Integer>().bubbleSort(ary);如果它是一个静态方法,你需要在方法本身上显式地传递类型参数,通过声明方法为public static <E extends Comparable<E>> bubbleSort(ArrayList<E> a) {...},而不是将类型参数放在Sort类上,在这种情况下它只充当命名空间。 -
你完全误解了泛型。
-
我完全不知道为什么
Sort implements Comparable。你可能打算让E有界:docs.oracle.com/javase/tutorial/java/generics/bounded.html -
我还可以建议您不要对集合进行排序,而是对数组进行排序?您选择了计算机科学已知的最低效的排序算法之一,并且以最糟糕的方式应用它。