web-dev-qa-db-ja.com

2次元配列のx、y、row、col属性は逆ですか?

x、y座標平面について考えると、x、yは順序付きペアの一般的な表記ですが、2次元配列を使用する場合、myArray [row] [col]があり、rowはyで、colはxです。 。それは逆ですか、それとも私はそれを間違っていると考えていますか? myArray [x] [y]のように見えると思っていましたが、実際の行と列(ゲームボードなど)が必要な場合は間違っています。行列ボードを真に模倣するのはmyArray [y] [x]ではないでしょうか。 ?

41
johnny

あなたはそれを正しく持っています、そしてそれは少し逆に感じます。行番号はy座標、列番号はx座標ですが、通常はrow、colと記述しますが、通常はx、yとも記述します。

配列を[y] [x]として書き込むか、[x] [y]として書き込むかは、メモリ内のレイアウトを実際にどの程度重視するかによって異なります(行う場合は、使用する言語)。また、行または列を個別に操作できる関数/メソッドを作成するかどうか。

C/C++コードを記述している場合、配列は Row Major Order に格納されます。これは、データの単一行を1次元配列として処理できることを意味します。ただし、1列のデータではできません。正しく覚えていれば、VBは列の主な順序を使用するため、言語が異なります。C#も行の主な順序ではないことに驚かれるでしょうが、わかりません。

36
John Knoeller

これは私が自分の正気のためにやっていることです:

int x = array[0].length;
int y = array.length;

そして、私が行うすべての配列呼び出しに対して、次のように記述します。

array[y][x]

これは、グラフ作成アルゴリズムと水平/垂直行列の反転に特に役立ちます。

4
wild_nothing

データを配列に格納する方法は関係ありません([x] [y]または[y] [x])。重要なのは、常に配列を連続的にループすることです。 Java 2次元配列は、基本的に2番目の配列を格納する1次元配列です(たとえば、[y] [x]の場合、[y]の長い配列があり、各y yのその行に対応する[x]配列を保持します。

配列全体を効率的に実行するには、その配列を継続的に検索して、あるy-array-of-xarrayから別のy-array-of-にジャンプする必要がないように、データにアクセスすることが重要ですxarrays。あなたがしたいことは、1つのy要素にアクセスし、次のy要素に移動する前にそこにあるすべてのxにアクセスすることです。

したがって、Array [y] [x]の状況では。最初の変数は常に外側のループにあり、2番目の変数は内側のループにあります。

for (int ys = 0; ys < Array.length; ys++)
    for (int xs = 0; xs < Array[y].length; xs++)
    {
        do  your stuff here
    }

そしてもちろん、両方のArray.lengthsをループから事前に割り当てて、これらの値をサイクルごとに取得する必要がないようにします。

4
MacD

実際、それはあなた次第です。あなたの質問には考える権利はありません。たとえば、私は通常、1次元配列をセルの行と見なします。だから、私の心の中でそれはarray [col] [row]です。しかし、それはあなた次第です...

0
anthares

これについては多くの異なる意見があると思います。結論としては、首尾一貫していれば問題はありません。同じデータを使用する他のライブラリまたは類似のものがある場合、統合を容易にするためにそれらが何をするにも意味があるかもしれません。

これが厳密に独自のコード内にある場合は、快適な方法で実行してください。私の個人的な好みは、myArray [y] [x]を使用することです。それらが大きい場合、同時に多くアクセスする項目を一緒に保持することでパフォーマンス上の利点が得られる可能性があります。しかし、私はそれが非常に遅い段階になるまでそれについて心配しませんでした。

0
villintehaspam

よくわかりませんが、行をx軸上の要素と考え、2d配列がy軸上の行要素の集まりである場合、xをすでに知っているので、yを使用して行を操作するのが普通です。 (その特定の行xは常に同じであり、そのyはそのインデックスによって変化します)、次にxを使用して複数の行要素を操作します(行は特定のy値で垂直に積み上げられます)

0
Shivan Dragon