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