0

首先让我说这与我正在参加的一门课的家庭作业有关。我实际上已经有了家庭作业的答案,但我决定更进一步来帮助自己理解面向对象编程,因为我目前是一名程序员,但我的教育存在一些差距,因为我实际上只做了一些大学的高级编程课,我做的大部分是汇编和c,这显然有很大不同。

无论如何,我不得不为家庭作业写一个冒泡排序。没问题。但我也在阅读泛型并且不太了解它,所以我想为自己的理解制作一个泛型冒泡排序。

据我了解,使用泛型的原因是您可以在不同类型的数据上使用相同的泛型类。

从我的主要方法中,我调用 doBubbleSort 方法并向它发送一个整数数组列表。我希望能够向它发送任何类型的数组列表。

这是我为泛型更新的气泡排序:

public static<T> ArrayList doBubbleSort(ArrayList<T> arrayList)
{
    boolean wasSwapped;//
    do{
        wasSwapped = false;
        for (int i=1; i<arrayList.size();i++)
        {
            int b = arrayList.get(i-1).compareTo(arrayList.get(i));
            if (b<0)
            {
                int temp = arrayList[i];
                arrayList[i] = arrayList[i-1];
                arrayList[i-1] = temp;
                wasSwapped = true;
            }


        }
    }while (wasSwapped);
    return arrayList;
}

我一生都无法弄清楚如何正确使用比较语句。我目前找不到符号 - 方法 compareTo(T) 。我希望这里有人可以在正确的方向上推动我。

我也知道在某些时候我必须指定类型。可以在方法调用中执行还是必须在方法本身中执行。我假设我这样称呼它 ArrayList al = Sorting.doBubbleSort(al); 如果我想对字符串进行排序,那就是 ArrayList al = Sorting.doBubbleSort(al);

请帮助我进行比较,并让我知道我对泛型的理解在哪里偏离了轨道。谢谢

感谢您迄今为止的所有帮助。我更改了代码以反映@LuiggiMendoza 和@newaccts 的建议。经过一番争吵后,我得到了它的工作,我想我开始正确理解它了。唯一的问题是我不知道如何为 temp 声明一个泛型变量。现在我刚刚添加了另一个通用列表,并使用元素 0 进行交换,但这似乎效率很低,所以我想知道你是否可以提出任何建议。

    public static<T extends Comparable<? super T>> List<T> doBubbleSort(List<T> list)
    {
        boolean wasSwapped;
        List<T> temp = new ArrayList<>();
         temp.add(list.get(0));

        do{
            wasSwapped = false;
            for (int i=1; i<list.size();i++)
            {
                int b = list.get(i-1).compareTo(list.get(i));
                temp.set(0,list.get(i));
                if (b>0)
                {    
                    list.set(i,list.get(i-1));//list[i] = list[i-1];
                    list.set(i-1,temp.get(0));//list[i-1] = temp;
                    wasSwapped = true;
                }


            }
        }while (wasSwapped);
        return list;
    }

}
4

1 回答 1

4

你需要一些方法来比较你的元素。解决这个问题的常用方法是要求他们实施Comparable

public static<T extends Comparable<T>> ArrayList<T> doBubbleSort(ArrayList<T> arrayList)

甚至更好(针对接口编码):

public static<T extends Comparable<T>> List<T> doBubbleSort(List<T> list)

另一种方法就像@LuiggiMendoza 建议的那样,提供一个Comparator进行比较:

public static <T> doBubbleSort(List<T> list, Comparator<T> comparator)
于 2013-05-22T04:37:31.773 回答