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
相关产品推荐
相关产品推荐

