4

作業中のゲームのマップ データを格納するために使用している配列があります。

MyMapType[,,] map; 

Collection の代わりに固定配列を使用する理由は、固定配列の方がはるかに高速に動作するためです。

今私の問題は、ゲームで負の z レベルをサポートしたいということです。だから私は負のインデックスにアクセスできるようにしたいと思います。

これが不可能な場合は、他の解決策をいくつか考えました。

地上レベルを任意の数値 (たとえば 10) として持つことが可能な解決策として考えていましたが、10 未満のものは負と見なすことができます。しかし、これは、使用されていない場合、配列を無駄に 10 倍大きくするのではないでしょうか?

私が考えたもう 1 つの解決策は、2D 配列のディクショナリがあり、Z レベルがインデックスとしてリストに保持されている場合に、「独自にロールする」ことでした。しかし、これはより多くの作業であり、遅いかどうかはわかりません。

要約すると、負のインデックスをサポートする配列を作成する方法はありますか? そうでない場合は、CPU 時間や RAM を過度に犠牲にすることなく、そのような動作を「エミュレート」するクリーンな方法はありますか?

4

5 に答える 5

9

配列をクラスに置き換えます。

class MyArray {
    private MyMapType[] myArray = new myMapType[size]
    MyMapType this[index] {
       get{return myArray[index + offset];}
    }

}

コンストラクターでサイズとオフセットを設定することも、自由に変更することもできます。

この例に基づいて、別のバージョンを作成します。

class MyArray {
    private MyMapType[] positives = new myMapType[size]
    private MyMapType[] negatives = new myMapType[size-1]
    MyMapType this[index] {
       get{return index >= 0 ? positives[index] : negateves[1-index];}
    }

}

両方のサイズを設定する必要があるという事実は変わりません。正直最初の方が好き

于 2013-03-31T14:30:32.287 に答える
1

キーまたは値に任意の値を割り当てることができるため、Dictionary クラスを使用します。上で示した 3 次元配列でこれがどのように機能するかはわかりませんが、これが 1 次元配列である場合にどのように機能するかを示すことができ、それを最大限に活用する方法を推測できます。

MyMapType[] map;

//map is filled with w/e data

Dictionary<int, MyMapType> x = new Dictionary<int, MyMapType>();

x[-1] = //(map data for whatever value is for the negative value);
x[0] = map[0]
//(etc...)
于 2015-09-20T00:48:08.103 に答える
1

MyMapTime[,] のリストを 2 つのリストに保存してみてください:

  • 0 以上の z 値に対して 1
  • および負の z 値の 2 番目。

テーブルのインデックスは z の値になります。これがあれば、特定の z レベルの xy 値にすばやくアクセスできます。もちろん問題は次のとおりです。あなたの Z 値は何ですか? 疎か密か。スパース値の場合でも、[,] の null 値を保持する配列になってしまいます。

于 2013-03-31T14:31:38.427 に答える
-1

ここで、辞書は負のインデックスを許可し、2D 辞書もこのような問題を解決できることに注意したいと思います。データ構造について考えてみてください。辞書を使用できるかどうか

辞書とリストは異なるシナリオで使用されることに注意してください。それらの速度は、それらで使用される機能によって異なります

于 2016-03-15T12:34:45.797 に答える