首页 > 解决方案 > 将行和列值转换为具有分组值的多个数组的索引

问题描述

这种问题经常出现,但请耐心等待,它有一个转折点。

假设您有以下数组...

[A, B, C, D, E, F, G, H , I, J, K, L]

您将其映射到这样的网格

 | 0 1 2 3
 ----------
0| A D G J
1| B E H K
2| C F I L

如果您需要查找网格中任何项目的原始数组索引,可以使用此公式(行和列从零开始)。

col * numRows + row

因此,位于2,2网格坐标处的“I”的索引将是...

2 * 3 + 2 = 8

简单!所以现在想象你有两个数组......

[A, B, C, D, E, F, G, H , I, J, K, L]
[@, &, *, #, €, %, ƒ, œ, ≈, ∑, ß, Ω ]

它以这样的网格布局......

   0 1 2 3 4 5 6 7
 -----------------
0| A @ D # G ƒ J ∑
1| B & E € H œ K ß
2| C * F % I ≈ L Ω

现在您需要约束列索引,以便 0 & 1 = 0、2 & 3 = 1 等。为此,我想出了这个公式。

Math.floor(column / numArrays) * numRows + row;

现在让我们把它调高。想象一下你有这两个数组(每个数组 16 项)

[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8]
[100,100,200,200,300,300,400,400,500,500,600,600,700,700,800,800]

但是现在,您希望网格显示已对值求和的行

   0 1   2  3
----------------
0| 2 200 10 1000 
1| 4 400 12 1200
2| 6 600 14 1400
3| 8 800 16 1600

并且您想在原始数组中找到第一个索引,例如值 8 的索引将是 15,或者值 400 的索引将是 2。

我做了一个天真的假设,即您可以将行和列索引乘以chunk size我用来对值求和的值。然而,这是完全错误的。

那么,当网格由多个数组组成时,是否可以使用行和列索引在平面数组中导出索引,这些数组的值已经交错并求和(或者我称之为“折叠”)?

更新:我已经取得了一些进展。如果我的第二个公式是函数

func coordsToIndex(col, row, totalDataSets, totalRows) {
  return Math.floor(col / totalDataSets) * totalRows + row;
}

如果变量chunkSize表明有多少个值被加在一起,那么这个

coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize

接近了,但结果索引总是比块大小太大。所以!

(coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize) - chunkSize

给我正确的值,但只有当 chunkSize 大于零时,这导致我......

index = (coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize)
realIndex = chunkSize > 1 
  ? (index * chunkSize) - chunkSize 
  : calculatedIndex;

我感觉到有一种更简洁的方法可以做到这一点,而且我遗漏了一些明显的东西。

标签: arraysmath

解决方案


推荐阅读