#java
#java
Вопрос:
У меня есть список некоторого типизированного объекта, где каждый узел списка имеет массив [n].
Теперь, исключая временную сложность, сейчас мне нужно сравнить каждый элемент массива со всеми элементами других массивов внутри списка. Как я могу это сделать? Потому что, если бы список был фиксированного размера, я бы сделал что-то подобное (предположим, что размер равен 3):
for(Array firstArray : lst.get(0).getArray()){
for(Array secondArray : lst.get(1).getArray()){
for(Array thirdArray : lst.get(2).getArray()){
//do something
}
}
}
Но со списком без фиксированного размера? Как можно достичь моей цели?
Ответ №1:
В неопределенном количестве циклов? Звучит как рекурсия:
void doAll(List<ArrayHolder> lst) {
doAllFrom(lst, 0);
}
void doAllFrom(List<ArrayHolder> lst, int off) {
if (off == lst.length()) {
//do something
} else {
ArrayHolder arrayHolder = lst.get(off);
for (Array nthArray : arrayHolder.getArray()) {
doAllFrom(lst, off 1);
}
}
}
Очевидно, вам нужно будет что-то сделать nthArray
. Возможно, добавление его в линейный список текущих Array
:
void doAll(List<ArrayHolder> lst) {
doAllFrom(lst, new ArrayHolder[lst.size()], 0);
}
void doAllFrom(List<ArrayHolder> lst, ArrayHolder[] holders, int off) {
if (off == lst.size()) {
//do something
} else {
ArrayHolder arrayHolder = lst.get(off);
for (Array nthArray : arrayHolder.getArray()) {
holders[off] = nthArray;
doAllFrom(lst, holders, off 1);
}
}
}
Комментарии:
1. Ваш ответ абсолютно правильный, но я думаю, что мой вопрос слишком общий, извините за это. Список имеет размер n, а массивы имеют размер m (независимо друг от друга). И мне нужно найти элементы каждого массива с близостью к отметке времени в 10 секунд. Возможно, я открою другой вопрос, но пока это лучший ответ
2. @Pikappa Не имеет значения, что массивы имеют разные размеры —
for
цикл обработает это (по одному на кадр). Все индексы в приведенном выше коде находятся в списке (и совпадаютArrayHolder[]
), а не в ваших массивах.
Ответ №2:
for(Array first : lst.get(0).getArray()){
for(int i: first){ //i is first element of comparison
for(Array second : lst.get(0).getArray()){
for(int j: second){ //j is second element of comparison
if(i compare j)
//do something
}
}
}
}
это сделает вашу работу, но сложность слишком плоха.
Рассматриваемые элементы массивов являются целыми числами.