通用arraylist bubblesort问题

时间:2013-09-29 23:37:02

标签: java generics arraylist

我知道有内置例程,但作为一个学习者,我想使用自己的设备进行排序,并且由于排序是旧的,我决定尝试制作我自己的泛型排序例程如果我弄清楚它们是如何在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
  }
}

我试图学习我感觉准备的事情,但却发现我还没准备好;关闭,无雪茄。

3 个答案:

答案 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) {

回答我自己的问题,“现在,为什么我没有想到那些?”......“为什么 我想到了他们?”

编辑:“参数化”或“通用”方法与参数化/通用类型一样合法,为什么不呢?

但我仍然不知道为什么,“显然是合法的”或不是,我已经想到了“技巧”。

编辑:一个字:经验