首先请允许我说这与我正在选修的课程的作业有关。我实际上已经有了家庭作业的答案,但我决定更进一步,以帮助自己理解面向对象的编程,因为我目前作为程序员工作,但我的教育有一些空白,因为我实际上只做了一些大学里的高级编程课程,我所做的大部分是汇编和c,这显然是很不一样的。
无论如何,我必须为家庭作业写一个泡泡排序。没问题。但是我也在阅读有关泛型的内容并且不太了解它,所以我想根据自己的理解制作一个通用的bubblesort。
根据我的理解,使用泛型的原因是你可以在不同类型的数据上使用相同的泛型类。
从我的main方法中,我调用doBubbleSort方法并向其发送一个整数列表。我希望能够发送任何类型的arraylist。
以下是针对泛型更新的气泡排序:
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;
}
我不能为我的生活弄清楚如何正确使用compare语句。我目前正在找不到符号 - 方法compareTo(T)。我希望这里有人可以给我一个正确方向的推动。
我也知道在某些时候我必须指定类型。是可以在方法调用中执行它还是必须在方法本身中。我假设我称之为ArrayList al = Sorting.doBubbleSort(al); 如果我想对字符串进行排序,那么它将是ArrayList al = Sorting.doBubbleSort(al);
请通过我的比较帮助我,让我知道我对Generics的理解已脱离了轨道。 感谢
到目前为止,感谢您的帮助。我已经更改了我的代码以反映@LuiggiMendoza和@newaccts建议。经过多次争吵后,我开始工作了,我想我已经开始理解它了。唯一的问题是我无法弄清楚如何为temp声明一个通用变量。现在我刚刚添加了另一个通用List,并使用元素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;
}
}
答案 0 :(得分: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)