我知道有内置例程,但作为一个学习者,我想使用自己的设备进行排序,并且由于排序是旧的,我决定尝试制作我自己的泛型排序例程如果我弄清楚它们是如何在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
}
}
我试图学习我感觉准备的事情,但却发现我还没准备好;关闭,无雪茄。
答案 0 :(得分:4)
此:
public abstract class Sort<E> implements Comparable<E> {
表示E
是任意对象类型,Sort<E>
的实例可以与E
的实例进行比较。 (因此,您的错误消息抱怨E.compareTo
不存在,因为Object
没有这样的方法。)您想要的是:
public abstract class Sort<E extends Comparable<E>> {
表示E
必须是其实例可以相互比较的类型。
编辑添加:实际上,正如SLaks一起指出的那样,Sort
没有真正的理由是通用的;你只需要bubbleSort
方法是通用的。此外,正如MadProgrammer所暗示的那样,Sort
应该是非abstract
(因此您可以直接实例化它)或bubbleSort
应该是static
(因此可以在不实例化的情况下调用它)一个Sort
实例)或两者。例如:
public class Sort {
private static <E> void swap(ArrayList<E> a, int i, int j) {
...
}
private static <E extends Comparable<E>> void bubbleSort(ArrayList<E> a) {
...
}
...
}
更好的是,Sort
可以是sort
方法的接口,BubbleSort.sort(...)
只是它的一个实现(而不是给Sort
一个特定的{{1}方法)。
答案 1 :(得分:1)
如果可以,我想发表评论。
学习BubbleSort是学习如何在Java中使用数据结构的好方法。我同意其他人的观点,在现实世界中,你永远不会使用BubbleSort,因为它提供了除“StoogeSort”之外的任何排序算法的最差性能。
但是,如果它教会你如何做重要的事情,如使用和应用泛型类型参数,使用控制流语句(例如for循环),甚至做异常处理。不要听反对者的意见。 Bubblesort的主要优点是算法简单。
在我看来,更简单的排序算法是“延迟替换排序”,也称为“选择排序”。延迟替换排序具有与BubbleSort(O(n ^ 2))相同的不良时间复杂度,但与BubbleSort不同,选择排序仍在某些应用中使用。它作为一种优化的排序算法中的子算法被合并,并且因为它最小化了订购集合所需的交换次数,所以当执行交换的成本很高时,仍然使用选择排序。
延迟替换排序的伪代码如下所示,在我看来,甚至比BubbleSort更简单:
Begin DELAYEDSORT
For ITEM=1 to maximum number of items in list-1
LOWEST=ITEM
For N=ITEM+1 to maximum number of items in list
Is entry at position N lower than entry at position LOWEST?
If so, LOWEST=N
Next N
Is ITEM different from LOWEST
If so, swap entry at LOWEST with entry in ITEM
Next ITEM
End DELAYEDSORT
延迟替换排序可以比BubbleSort快50%,但仍然不应该用于排序非常大的集合。
答案 2 :(得分:0)
在接受SLaks的建议并变得更熟悉泛型(昨天制作通用堆栈和队列类)之后,今天我使用了ruakh的大纲(但必须在“bubblesort”中将private
更改为public
line)它使main
发生了重大变化(现在归结为一个有用的行Sort.bubbleSort(ary);
)并且它有效,但我有两个燃烧的问题 :
(1)第一个<E>
在这一行中的意思/做法/暗示到底是什么:
private static <E> void swap(ArrayList<E> a, int i, int j) {
(2)同样......这里有<E extends Comparable<E>>
的内容:
private static <E extends Comparable<E>> void bubbleSort(ArrayList<E> a) {
回答我自己的问题,“现在,为什么我没有想到那些?”......“为什么 我想到了他们?”
编辑:“参数化”或“通用”方法与参数化/通用类型一样合法,为什么不呢?
但我仍然不知道为什么,“显然是合法的”或不是,我已经想到了“技巧”。
编辑:一个字:经验