2013-03-31 3 views
3

У меня есть массив, который я использую для хранения данных карты для игры, над которой я работаю.Массив с отрицательными индексами

MyMapType[,,] map; 

Причина, по которой я использую фиксированный массив вместо коллекции, заключается в том, что фиксированные массивы работают намного быстрее.

Теперь моя проблема в том, что я хочу поддерживать отрицательные уровни z в игре. Поэтому я хотел бы иметь доступ к отрицательному индексу.

Если это невозможно, я подумал о паре других решений.

Я думал как о возможном решении иметь уровень земли как некоторое произвольное число (скажем, 10), а все, что меньше 10, можно считать отрицательным. Но разве это не сделает массив в 10 раз больше ни для чего, если он не используется?

Другим решением, которое я рассматривал, было «бросить свое», где у вас есть словарь 2D-массивов, причем уровень Z удерживается в списке как индекс. Но это намного больше работы, и я не уверен, что он медленный или нет.

Итак, чтобы суммировать - любой способ создания массива, который поддерживает отрицательный индекс? И если нет - есть ли чистый способ «подражать» подобному поведению, не жертвуя слишком большим количеством процессорного времени или оперативной памяти - отметив, что это игровые карты, которые могут оказаться большими и должны быть доступны постоянно.

+0

Добавление 10 дополнительных элементов в массив не делает их больше на порядок (если только массив не имел только 1 элемент). –

+0

Используйте словарь. – SLaks

+0

@MattBall - Его многомерный массив, не будет 10x10x1 быть 1/10-м размером 10x10x10? – Haedrian

ответ

7

заменить массивы с классом:

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];} 
    } 

} 

Это не меняет того факта, что вам нужно, чтобы установить размер для них обоих. Честно говоря, мне нравится первый один лучше

+0

Это решение заставит его определить смещение. – aguyngueran

+0

Проблема в том, что мне нужен многомерный массив. Поэтому мне нужно будет переписать кучу кода, чтобы получить значение xth, yth, zth. Хм. – Haedrian

+0

@aguyngueran да, но он все равно хочет это сделать, и это неизбежно. определение смещения ничем не отличается от определения размера, и вы не можете обойтись без этого, если хотите массивы – mfeingold

1

Не могли бы вы попытаться сохранить список MyMapTime [,] в двух списках:

  • один для г значений больше или равно 0
  • и второго отрицательные значения z.

Индекс таблиц будет значением z. Имея это, вы сможете быстро получить xy-значения для определенного уровня z. Конечно, вопрос: каковы ваши значения z? Существуют ли разреженные или плотные. Даже для разреженных значений вы получите массив с нулевыми значениями для [,].

0

Используйте класс 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...) 
0

Я хотел бы отметить, что словари позволяют отрицательные индексы и 2D dictionairy может решить такие проблемы, как это тоже, просто думать о и структуре данных, если вы можете жить со словарем

Обратите внимание, что словари и списки используются в разных сценариях. и их скорость зависит от того, какие функции используются на них

Смежные вопросы