java - 通用数组列表冒泡排序问题

标签 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
  }
}

我正在尝试学习我感觉准备好的东西,结果发现我还没有完全准备好;关闭,无雪茄。

最佳答案

这个:

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 的接口(interface)方法,和 BubbleSort.sort(...)只是它的一个实现(而不是给 Sort 一个特定的 bubbleSort 方法)。

关于java - 通用数组列表冒泡排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19084532/

相关文章:

java - 用新对象更新 ArrayList+删除旧对象

c# - 如何区分泛型类中具有相同名称和参数个数的两个方法?

java - 为什么这个 JList 不更新以显示 ArrayList 属性

java - 计算 ArrayList 中项目的出现次数

java - 从 List1 中删除值也会从 List2 中删除值吗?

java - Maven 网址太长

Java LinkedList 迭代器过早耗尽

java - 如何解决返回泛型枚举的方法的不兼容上限错误

通用列表中的 C-Void 指针(包含结构)

java - 泛型以及在实现 Iterable Interface 的类中使用新创建的方法