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

Java中对象ArrayList选择排序失效问题求助

解决选择排序仅正确排序前两张卡片的问题

Hey there! Let's figure out why your sorting algorithm is only working for the first two cards and getting messy afterward.

问题分析

从你给出的代码片段来看,你尝试实现的是选择排序,但逻辑上有个关键漏洞:当你找到更小的minVal后,又嵌套了一个循环去寻找等于这个值的元素,这完全偏离了选择排序的核心逻辑——选择排序的核心是记录最小值的索引,而非仅记录值,然后通过交换当前起始位置和最小值位置的元素来完成每一轮排序。你额外的嵌套循环不仅多余,还会打乱排序流程,导致只有前两次循环能碰巧正确,后续排序彻底混乱。

修正后的代码实现

结合你的Deck类的方法(getCard()、getDeck()),这里给出正确的选择排序实现:

// 先获取Deck中的卡片列表
ArrayList<Card> cardList = deck.getDeck();
int totalCards = cardList.size(); // 用size代替固定的5,适配不同数量的卡片

// 选择排序主循环:每一轮确定第i个位置的最小值
for (int i = 0; i < totalCards - 1; i++) {
    // 初始化最小值索引为当前轮的起始位置
    int minIndex = i;
    int minVal = cardList.get(i).getVal();

    // 遍历未排序区间,找到最小值的索引
    for (int j = i + 1; j < totalCards; j++) {
        if (cardList.get(j).getVal() < minVal) {
            minVal = cardList.get(j).getVal();
            minIndex = j; // 关键:更新最小值的索引,而不是只存值
        }
    }

    // 如果最小值不在当前起始位置,交换两者
    if (minIndex != i) {
        Card tempCard = cardList.get(i);
        cardList.set(i, cardList.get(minIndex));
        cardList.set(minIndex, tempCard);
    }
}

关键改进点

  • 记录最小值索引而非仅值:这是选择排序的核心,只有记录索引才能准确找到需要交换的元素位置,避免你之前那种重复遍历找值的混乱逻辑。
  • 去掉多余的嵌套循环:你之前的k循环完全没必要,反而会干扰排序流程,直接通过索引交换就能完成每一轮的排序任务。
  • 通用化卡片数量:用cardList.size()代替固定的5,让代码适配不同数量的卡片排序。

额外注意事项

如果你的Deck.getDeck()方法返回的是卡片列表的副本而非原列表,那你需要确保修改后的列表能同步回Deck类中,或者给Deck类添加一个交换卡片的方法(比如swapCards(int index1, int index2)),直接通过Deck的方法来操作元素,避免修改副本无效的问题。

内容的提问来源于stack exchange,提问作者Brian Duncan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:34:19