2010-06-16 32 views
2

所以這是我的問題的一個更簡單的形式。 可以說我有2個數組。 A = {1,2}和B = {2,4,6}。 如果A和B共享一個元素,然後從B中刪除該元素。 我知道你可以循環遍歷並將A中的每個元素與B中的每個元素進行比較,但是必須有更好的方法!如何判斷2個數組是否共享相同的元素

回答

4

如果您的數組已排序(或者您可以對數組進行排序),則可以同時處理兩個數組。在兩個數組開頭開始,下去,直到你將推動超出其各自陣列結束的指針之一:

  • 如果< B,則推進指針
  • 如果A = B,然後刪除在b處
  • 元素如果> b,則提前在b指針
0

不,我不覺得。你必須循環。

0

如果數組中值是它的陣獨特的,你可以使數組索引的實際值,讓您直接尋求它的索引,而不是掃描整個陣列。

從擁有較少元素的數組開始,我假設你想要做excel/VB?我拍了一張照片來說明這個想法。

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

不是有兩個嵌套的循環,你有一個循環,它只是迭代的次數爲最小的數組。

2

你必須編寫代碼,但它不一定是一個蠻力的雙重嵌套循環,你不必從數組中做任何雜亂的移除單個元素。

如果您添加對Microsoft腳本運行時的引用(來自VBE中的「工具」菜單),則可以使用Dictionary對象來簡化操作。它有'存在','刪除'和'鑰匙'的方法。因此,您可以循環遍歷B,並在Dictionary中添加元素作爲鍵,然後循環遍歷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 

上述方法也從乙刪除重複,如果有任何。

如果您知道您的數組沒有錯誤值作爲元素,您還可以使用MATCH(以及VBA'Application.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()) 

,然後過濾出的位置處的#不適用於此。在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

嘿,所以我開始玩弄字典對象,我不知道vba可以使用它們。這是迄今爲止最酷的解決方案;但是,我在辦公室工作,讓每個人都啓用「Microsoft Scripting Runtime」是不切實際的。只是想認出你的答案,即使我沒有選擇它作爲我選擇的答案 – Ommit 2010-06-18 14:59:58

+0

無論什麼作品! FWIW,我認爲如果你的同事打開一個你創建的具有參考集的Excel文件,那麼它將工作得很好,而不必做任何事情。腳本運行時在Windows中幾乎總是存在,沒有做任何特別的事情。 – jtolle 2010-06-18 19:58:42

相關問題