You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含泛型参数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:47:51