为3列表格排序数组:从上到下从左到右填充布局适配问题
解决列优先排列的适配问题
你的核心需求是把列表按列优先的方式重新排列(先填满第一列,再第二列,以此类推),最终输出成 ADG BEH CFI 这样的分组。当前代码的问题在于位置计算逻辑有漏洞,当元素总数刚好是列数的整数倍时(比如9个元素配3列),会出现位置冲突,导致元素被覆盖。
问题分析
你代码里用 ((i * 3) - beanz.size() * shift) 计算目标位置,当 i=8(对应元素I)时:
i*3=24,beanz.size()=9,shift=(24)/9=2(整数除法)- 算出的
pos=24-9*2=6,而这个位置已经被i=2(元素C)占用了,所以I会覆盖C,结果自然出错。
正确的实现思路
要做通用的列优先排列,我们需要明确两个关键值:
- 列数:你这里固定是3,可以定义成常量
int cols = 3; - 行数:总元素数向上取整除以列数,公式是
int rows = (beanz.size() + cols - 1) / cols;(这样能适配非整数倍的情况,比如8个元素时rows=3)
然后,原列表中每个索引为 originalIdx 的元素,在新数组中的目标索引可以通过以下公式计算:targetIdx = (originalIdx % cols) * rows + (originalIdx / cols);
这个公式的逻辑很直观:
originalIdx % cols:得到元素所在的列号(0、1、2)- 乘以行数:得到该列在新数组中的起始位置偏移
originalIdx / cols:得到元素在该列中的行号(0、1、2...),加到起始偏移上就是最终位置
修正后的代码
import java.util.Arrays; import java.util.List; public class ColumnSortExample { public static void main(String[] args) { List<String> beanz = Arrays.asList("A", "B", "C", "D", "E", "F", "G", "H", "I"); int cols = 3; int total = beanz.size(); int rows = (total + cols - 1) / cols; // 向上取整计算行数 String[] sortedBeanz = new String[total]; for (int originalIdx = 0; originalIdx < total; originalIdx++) { int col = originalIdx % cols; int row = originalIdx / cols; int targetIdx = col * rows + row; sortedBeanz[targetIdx] = beanz.get(originalIdx); } // 按分组输出(每行cols个元素) for (int i = 0; i < rows; i++) { StringBuilder group = new StringBuilder(); for (int j = 0; j < cols; j++) { int idx = i + j * rows; if (idx < total) { // 处理元素数不足一行的边界情况 group.append(sortedBeanz[idx]); } } System.out.println(group.toString()); } } }
效果验证
- 9个元素时输出:
ADG BEH CFI - 去掉I(8个元素)时输出:
ADG BEH CF - 新增元素J(10个元素)时输出:
ADGJ BEH CFI
不管元素总数是不是列数的整数倍,这个实现都能正确按列优先排列并输出。
内容的提问来源于stack exchange,提问作者ave4496
相关产品推荐
相关产品推荐

