如何为含泛型参数的ArrayList实现排序方法?(CD按序列号排序)
解决泛型ArrayList的选择排序问题(按CD序列号排序)
首先,咱们先梳理下你当前代码里的几个核心问题:
temp被定义成了int类型,但你的泛型是T,得用T来存储临时对象才能完成元素交换selectionSort方法里的key参数看起来没用到,按需求咱们是要对整个列表按序列号排序,这个参数可以直接移除- 你得确保
CD类正确实现Comparable<CD>接口,这样泛型的比较逻辑才能生效
第一步:完善CD类的Comparable实现
首先,你的CD类需要实现Comparable<CD>,重写compareTo方法来按序列号做比较:
public class CD implements Comparable<CD> { private int serialNumber; // 这里可以添加你的其他属性(比如专辑名、歌手等)和构造方法 @Override public int compareTo(CD otherCD) { // 按序列号升序排序,如果需要降序,把两个参数反过来就行 return Integer.compare(this.serialNumber, otherCD.serialNumber); } // 别忘了给序列号加getter方法,方便后续验证排序结果 public int getSerialNumber() { return serialNumber; } // 可以根据需求添加toString或者其他属性的getter }
第二步:修正并完成Sorting类的selectionSort方法
现在咱们来修正Sorting类里的选择排序逻辑,利用泛型的Comparable特性来比较元素:
import java.util.ArrayList; public class Sorting<T extends Comparable<T>> { // 修正:移除没用的key参数,改为对整个列表进行排序 public void selectionSort(ArrayList<T> list) { int listSize = list.size(); // 遍历到倒数第二个元素即可,最后一个元素自然是最大的 for (int i = 0; i < listSize - 1; i++) { // 假设当前i位置是未排序部分的最小元素索引 int indexSmallest = i; // 遍历未排序的剩余元素,找到真正的最小元素索引 for (int j = i + 1; j < listSize; j++) { // 利用compareTo方法比较两个泛型对象,返回值<0说明j位置的元素更小 if (list.get(j).compareTo(list.get(indexSmallest)) < 0) { indexSmallest = j; } } // 交换当前i位置和最小元素的位置 T temp = list.get(i); list.set(i, list.get(indexSmallest)); list.set(indexSmallest, temp); } } }
第三步:在main方法中测试排序功能
接下来你可以在Main类里测试这个排序逻辑是否正常工作:
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList<CD> cdCollection = new ArrayList<>(); // 随便添加几个序列号乱序的CD对象 cdCollection.add(new CD(5, "经典老歌合集")); cdCollection.add(new CD(2, "摇滚精选")); cdCollection.add(new CD(7, "爵士蓝调")); cdCollection.add(new CD(1, "流行新歌榜")); // 创建排序器实例并执行排序 Sorting<CD> cdSorter = new Sorting<>(); cdSorter.selectionSort(cdCollection); // 打印排序后的结果,验证序列号是否按升序排列 System.out.println("排序后的CD列表(按序列号升序):"); for (CD cd : cdCollection) { System.out.println("序列号:" + cd.getSerialNumber()); } } }
关键说明
- 泛型约束
<T extends Comparable<T>>确保了所有传入的T类型都具备compareTo方法,这样咱们才能在排序中合法地比较元素 - 选择排序的核心逻辑是:每次遍历未排序部分,找到最小元素的索引,然后和当前起始位置的元素交换,逐步完成整个列表的排序
- 如果需要改成降序排序,只需要修改CD类的
compareTo方法,把Integer.compare(this.serialNumber, otherCD.serialNumber)改成Integer.compare(otherCD.serialNumber, this.serialNumber)即可
内容的提问来源于stack exchange,提问作者Blake Parsons
相关产品推荐
相关产品推荐

