如何按卡牌ID对hand列表中的Card对象进行升序排序
手牌按卡牌ID升序排序实现方法
已知条件
- 待排序的
hand是固定包含8个卡牌对象的无序列表 - 可通过
hand[索引].GetCardId()方法获取对应位置卡牌的ID,ID取值范围为1-52 - 排序要求:排序后列表索引0位置为ID最小的卡牌,索引7(最后一位)位置为ID最大的卡牌
实现逻辑
手牌仅8个元素,数据量极小,用实现成本最低的比较类排序即可满足需求,不需要复杂算法优化。
- 首先确认列表访问能力:示例中给出了
hand[0].GetCardId()的访问方式,说明列表支持0-7全索引访问,所有位置的卡牌ID都可以通过相同方式获取。 - 采用冒泡排序实现(代码量低,逻辑直白,该数据量下无性能问题):
- 外层共执行7轮遍历,每一轮都会把当前未排序区间里ID最大的牌“移”到区间末尾
- 内层遍历当前未排序的相邻卡牌,比较二者ID,若前一张ID大于后一张则交换两个卡牌在列表中的位置
- 全部遍历完成后列表自然呈ID升序排列,首尾分别为最小、最大ID的卡牌。
代码参考(通用伪代码)
// 固定8张牌的场景可直接写死长度,用长度变量适配性更好 const HAND_SIZE = 8 for i from 0 to HAND_SIZE - 2: for j from 0 to HAND_SIZE - 2 - i: cardIdA = hand[j].GetCardId() cardIdB = hand[j+1].GetCardId() if cardIdA > cardIdB: // 交换两张牌的位置 tempCard = hand[j] hand[j] = hand[j+1] hand[j+1] = tempCard
如果你使用的编程语言自带列表排序API,直接自定义排序规则为按GetCardId()返回值升序即可,代码更简洁,例如JS/TS等语言可直接写:
hand.sort((cardA, cardB) => cardA.GetCardId() - cardB.GetCardId())
执行后直接得到符合要求的有序手牌。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

