将2D数组映射到具有可变列宽的1D数组

时间:2016-05-30 18:36:28

标签: arrays math multidimensional-array indexing

我知道已经多次询问将2D数组映射到1D数组,但我没有找到适合列数变化的解决方案。

所以我想从这个二维数组中获得一维索引

     Col>   _0____1____2__
     Row 0 |_0__|_1__|_2__|
     V   1 |_3__|_4__|
         2 |_5__|_6__|_7__|
         3 |_8__|_9__|
         4 |_10_|_11_|_12_|
         5 |_13_|_14_|

正常公式index = row * columns + column不起作用,因为在第二行之后索引不合适。

这里的正确公式是什么?

修改

具体问题是我有一个项目列表,其中包含布局,如网格,但是数据的一维数组。因此,在循环遍历UI中的元素时,我需要获取正确的数据,但只能获取该元素的行和列。我需要找到一种方法将行/列值转换为数据数组的索引

Bad picture trying to explain it

3 个答案:

答案 0 :(得分:1)

真正最佳的答案(甚至可证明是正确的答案)将取决于您使用的语言以及它如何为此类阵列布置内存。

但是,仅仅根据面值来提问,你必须知道每行的实际长度是多少来计算一维索引。

因此,行长度遵循可以从数据推断的某种模式,或者您具有(或可以写入)rlen = rowLength(2dTable,RowNumber)函数。

然后,根据表的大小和运行速度,您可以通过添加所有先前的行长度来计算2d表中的1D索引,直到当前行长度小于2d列索引。

或者构建一个行长度(或交错行长)的1d表,这样你就可以扫描它,所以只调用每行的行长度函数一次。

通过更好地描述您的问题,您可能会得到更好的答案......

答案 1 :(得分:0)

对于替换3到2列的示例,可以构建公式:

index = (row / 2) * (3 + 2) + (row % 2 ? 3 : 0) + column

(类C语法,假设整数除法)

一般来说,实现你在这里做的事情的唯一方法是 jagged arrays ,就是创建一个数组数组,a.k.a。一个Iliffe向量。这意味着,使用行号作为指针数组的索引,指向包含实际数据的各个行数组。

答案 2 :(得分:0)

你可以有一个额外的一维数组,其长度为“长度”。那么你的公式是index = sum {length(i)} + column。我从0跑到行。