Android开发用嵌套for循环构建三层ArrayList生成飞镖选手出场顺序
飞镖赛事选手出场顺序生成实现
核心规律
不用逐次做数组右移操作,直接靠数学计算就能生成对应顺序,逻辑简单不容易出错:
- 盘序号从0开始计数,第
i盘的第一局,相比初始顺序[0,1,2...n-1]总共右移i位 - 同一盘内局序号从0开始计数,第
j局在盘首局的移位基础上,额外再右移j位 - 总移位值对选手总数取模,就能直接算出每个出场位置对应的选手索引,支持任意参赛人数,不局限于2人对战。
可直接运行的实现代码
// 计算赛事理论最大盘数、单盘理论最大局数 int maxTotalSets = playerAmount * (setsAmount - 1) + 1; int maxLegsPerSet = playerAmount * (legsAmount - 1) + 1; ArrayList<ArrayList<ArrayList<Integer>>> rootContainer = new ArrayList<>(maxTotalSets); for (int setIndex = 0; setIndex < maxTotalSets; setIndex++) { ArrayList<ArrayList<Integer>> currentSetContainer = new ArrayList<>(maxLegsPerSet); for (int legIndex = 0; legIndex < maxLegsPerSet; legIndex++) { ArrayList<Integer> currentLegOrder = new ArrayList<>(playerAmount); int totalShift = setIndex + legIndex; int modShift = totalShift % playerAmount; for (int position = 0; position < playerAmount; position++) { // 加playerAmount再取模是为了避免负数索引 int playerIndex = (position - modShift + playerAmount) % playerAmount; currentLegOrder.add(playerIndex); } currentSetContainer.add(currentLegOrder); } rootContainer.add(currentSetContainer); }
效果验证
用你给出的示例参数(setsAmount=3、legsAmount=3、playerAmount=2)运行代码,生成的结构和你给出的目标结果完全匹配:
- 第1盘(setIndex=0)各局移位值为0/1/2/3/4,对应顺序为[0,1]、[1,0]、[0,1]、[1,0]、[0,1]
- 第2盘(setIndex=1)各局移位值为1/2/3/4/5,对应顺序为[1,0]、[0,1]、[1,0]、[0,1]、[1,0]
- 后续3、4、5盘的顺序完全符合盘间轮换、局间轮换的规则。
实用提示
预生成全部顺序后,实际比赛过程中如果提前决出胜负,不需要修改容器结构,直接按照当前进行到的盘、局序号取对应顺序即可,不用动态增删节点,实现成本更低。
内容的提问来源于stack exchange,提问作者Blaupunkt
相关产品推荐
相关产品推荐

