Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Octtrees являются способом пойти. Вы подразделяете массив на 8 октантов:
1 2 3 4 --- 5 6 7 8
И затем разметьте их в памяти в порядке 1, 2, 3, 4, 5, 6, 7, 8 как выше. Вы повторяете это рекурсивно в каждом октанте, пока Вы не переходите к некоторому основному размеру, вероятно, приблизительно приблизительно 128 байтов (это - просто предположение - удостоверяются, что представили для определения оптимального предела). Это имеет много, намного лучшую когерентность кэш-памяти и местность ссылки, чем наивное расположение.
Одна альтернатива древовидному методу: Используйте Morton-порядок закодировать Ваши данные.
В трех измерениях это идет как это: Возьмите координатные компоненты и чередуйте каждый бит два нулевых бита. Здесь показанный в двоичном файле: 11111b становится 1001001001b
C-функция, чтобы сделать это похоже на это (показанный для ясности и только для 11 битов):
int morton3 (int a)
{
int result = 0;
int i;
for (i=0; i<11; i++)
{
// check if the i'th bit is set.
int bit = a&(1<<i);
if (bit)
{
// if so set the 3*i'th bit in the result:
result |= 1<<(i*3);
}
}
return result;
}
Можно использовать эту функцию для объединения положений как это:
index = morton3 (position.x) +
morton3 (position.y)*2 +
morton3 (position.z)*4;
Это превращает Ваш трехмерный индекс в одномерный. Большая часть его: Значения, которые близки в 3D пространстве, приближаются 1D пространство также. При доступе к значениям друг близко к другу часто, Вы также получите очень хорошее ускорение, потому что кодирование morton-порядка оптимально с точки зрения местности кэша.
Для morton3 Вы лучше не используете код выше. Используйте маленькую таблицу, чтобы искать 4 или 8 битов за один раз и объединить их вместе.
Надежда это помогает, Nils
Книга Основы Многомерных и Метрических Структур данных может помочь Вам решить, какая структура данных является самой быстрой для запросов диапазона: деревья октантов, kd-деревья, R-деревья... Это также описывает форматы данных для того, чтобы держать точки вместе в памяти.