2016-05-30 11 views
0

2次元配列を1D配列にマッピングすることは何度も尋ねられていますが、列数が異なる場所に適したソリューションは見つかりませんでした。2D配列を可変列幅の1D配列にマッピング

だから私は、この2次元配列から1次元のインデックスを取得

 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は、インデックスが場違いである2行目の後にあるため、動作しません。

ここで正しい式は何ですか?

EDIT:

特定の問題は、私はグリッドのようなレイアウトで項目のリストを持っているということですが、データの1次元配列。したがって、UIの要素をループしながら、正しいデータを取得する必要がありますが、その要素の行と列しか取得できません。私はあなたが式を構築することができます3〜2列交互にご例えば、データアレイ

Bad picture trying to explain it

+1

特定の「公式」はありません。この特定のレイアウトを表すいくつかの手段を提供し、それを使用する必要があります。 –

答えて

0

のインデックスに行/列の値を有効にする方法を見つける必要があります。

しかし 一般に
index = (row/2) * (3 + 2) + (row % 2 ? 3 : 0) + column 

(Cに似た構文、整数除算を想定)

、1、あなたがここで何をやっている実装するための唯一の方法は、配列番号:は、配列の配列a.k.a.Iliffeベクトルを作成することです。つまり、実際のデータを含む個々の行配列を指すポインタの配列に行番号をインデックスとして使用します。

+0

Exaclty!したがって、行の長さはデータから推測できるパターンに従います。 –

+0

これは私の必要条件を満たしているようですが、私はどのように考えているのかわかりません。ありがとう! – Mknsri

1

本当に最適な答え(または確かに正しいもの)は、使用する言語とそのような配列のメモリをどのようにレイアウトするかによって異なります。

しかし、あなたの質問を単に額面で考えると、1Dインデックスを計算するためには、各行の実際の長さを知る必要があります。

したがって、行の長さは、データから推測できるパターンに従うか、rlen = rowLength(2dTable、RowNumber)関数を持つ(または書き込む)ことができます。

次に、テーブルの大きさと実行の速さに応じて、現在の行の長さが2d列のインデックスよりも小さくなるまで、すべての前の行の長さを加算することによって、2dテーブルから1Dインデックスを計算できます。

を作成するか、行長(またはコミット行長)の1d表を作成してスキャンできるようにしてください。したがって、各行のrowlength関数を1回だけ呼び出すようにしてください。あなたの問題をよりよく説明して

、あなたはより良い答えを得る可能性があります...

0

あなたは、列の長さを有する追加の1次元配列は、「長さ」と言うことができます。あなたの数式はindex = sum {length(i)} + columnです。私は0から行を実行します。

関連する問題