2010-07-30 2 views
0

У меня есть массив array размера N. Для каждых 3 индексов в нем я хочу их вынуть и объявить и присвоить эти значения другому массиву размера 3. Затем я хочу вернуться к этому массиву и взять следующий 3 и поместите его в другой массив размера 3. Я буду повторять это так для 3-х разных массивов размером 3 a1,a2,a3, как только это будет сделано. Я хочу опорожнить a1,a2,a3 и снова добавить значения NEXT 3 в 3 массива размера 3 повторяя это до тех пор, пока не достигнем array.lengthКаков наиболее эффективный способ сделать это?

Что было бы лучшим/наиболее эффективным способом сделать это?

+1

Является ли размер N garuanteed быть кратно 3 (или 9 для этого вопрос?) –

+0

более точная тема была бы более эффективной, тоже – MRalwasser

ответ

3
for (int i=0; i<=N-9; i+=9) { 
System.arrayCopy(arrayN, i, a1, 0, 3); 
System.arrayCopy(arrayN, i+3, a2, 0, 3); 
System.arrayCopy(arrayN, i+6, a3, 0, 3); 
// presumably do other stuff here 
} 

Это довольно хрупкий, но быстрый способ сделать это. Каждый раз, когда предыдущие значения перезаписываются, нет необходимости очищать. Если вам нужно очистить arrayN, вы можете просто Arrays.fill(arrayN, null) после цикла.

EDIT: для менее хрупкого ответа я собираюсь предположить, что вы будете накачивать массивы m x n. Вместо жесткого кодирования a1, a2, ... am, сделайте 2D-массив a[m][n].

for (i=0; i<=N-m*n; i+=m*n) { 
for (int j=0; j<m; j++) System.arrayCopy(arrayN, i+n*j, a[j], 0, n); 
// presumably do other stuff here 
} 

и, как Адриан говорит в комментарии, объявить i вне цикла и использовать его значение по отношению к N, чтобы иметь дело с остатками в зависимости от обстоятельств.

+0

+1 Это было то, что я имел в виду, когда комментировал вопрос. –

+0

@Adrian: это должно удовлетворять неправильной задаче длины, при условии, что правильный ответ не должен быть barf и работать с как можно большим количеством массива. В качестве альтернативы, если каким-то образом известно, что N является кратным 9, управление циклом может быть изменено только на 'i Carl

+0

Вы можете объявить «i» за пределами цикла и выполнить столбцовый цикл со всеми оставшимися элементами, если он не кратен 9 –

7

В качестве общей стратегии я бы не стал беспокоиться об эффективности вначале.

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

Его легче сделать правильный код быстрее, чем сделать быстрый код правильным.

+3

+1 Для «Лучше сделать правильный код быстрее, чем быстро сделать правильный код». –

+0

+1 люблю эту цитату! –

0

Его очень легко, вы можете сделать это следующим образом .... Это фрагмент кода ниже ....

байт [] YourBigArray = новый байт [SomeValue];

int temp = 0;

в то время (температура < YourBigArray.size - 1) { System.arraycopy (YourBigArray, темп, smallarray, 0, 3); temp + = 3; }

Попробуйте этот код, а также обратитесь к документации функции ArrayCopy ....

Наслаждайтесь .....

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