Как определить, что два массива используют один и тот же элемент? - PullRequest
2 голосов
/ 16 июня 2010

Так что это более простая форма моей проблемы.Допустим, у меня есть 2 массива.A = {1,2} и B = {2,4,6}.Если A и B совместно используют элемент, тогда удалите этот элемент из B. Я знаю, что вы можете просмотреть и сравнить каждый элемент в A с каждым элементом в B, но должен быть лучший способ!

Ответы [ 4 ]

4 голосов
/ 16 июня 2010

Если ваши массивы отсортированы (или вы можете отсортировать массивы), вы можете одновременно работать с обоими массивами. Начиная с начала обоих массивов и продолжая, пока вы не продвинете один из указателей за пределы конца соответствующего массива:

  • Если a Если a = b, то удалить элемент в b
  • Если a> b, то передвиньте указатель b
2 голосов
/ 16 июня 2010

Вы должны написать код, но он не должен быть циклом с двойным вложением, и вам не нужно беспорядочно удалять отдельные элементы из массивов.

Если вы добавитеСсылка на Microsoft Scripting Runtime (из меню Tools в VBE) позволяет упростить использование объекта Dictionary.У него есть методы для «Exists», «Remove» и «Keys».Таким образом, вы можете выполнить цикл B и добавить элементы в качестве ключей в Словаре, а затем выполнить цикл A, проверяя, существуют ли эти элементы, и, если да, удаляя их.

Как псевдокод:

for each elem in b
    dict(elem)=0 
next elem

for each elem in a
    if dict.exists(elem)
        dict.remove(elem)
    end if
next elem

return dict.keys

Приведенный выше подход также удаляет дубликаты из B, если они есть.

Если вы знаете, что у ваших массивов нет значений ошибок в качестве элементов, вы также можете использовать MATCH (и в приложении VBA '.Match 'или' Application.WorksheetFunction.Match ').Выполнение чего-то вроде

=MATCH({2,4,6},{1,2},0)

вернет {2, # N / A, # N / A}.Любая позиция с # N / A - это позиция элемента B, которого не было в A. Если вы выполняете сопоставление на листе, вы можете перетащить формулу, например

=IF(ISNA(cell of match),corresponding cell of B,NA())

, и затем отфильтроватьиз # N / Как из этого.В VBA вы могли бы сделать (больше псевдокод):

matches=application.match(b,a,0) 

for each elem in matches
    if iserror(elem)
        add corresponding element of b to result
    end
next elem

redim result to new smaller size

return result

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

0 голосов
/ 16 июня 2010

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

Начните с массивав котором меньше элементов, и я предполагаю, что вы хотите сделать Excel / VB?Я сделал иллюстрацию, чтобы проиллюстрировать эту идею.

http://img694.imageshack.us/img694/1503/hackmap.jpg

Вместо двух вложенных циклов у вас есть один цикл, и он повторяется только столько раз, сколько наименьший массив.

0 голосов
/ 16 июня 2010

Нет там не думаю.Вы должны пройти через.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...