2017-06-16 55 views
-4

林具有類似下面的數組:如何從ruby中的另一個單詞旁邊的數組中刪除/刪除單詞?

["a", " OR ", "bc cd", " NOT ", "e"] 

在那如何刪除旁邊NOT元件?我已經展示了靜態的例子。數組中的值是動態的。我必須找到NOT運算符,並且我必須在所有數組中刪除NOT的下一個單詞。

由於

+0

有什麼預期的輸出?另外,你到目前爲止還有什麼? –

+0

期望的輸出應該是[「a」,「OR」,「bc cd」],並且我已經嘗試過find_element_after,delete_at,index – user7348784

+1

'[「a」,「OR」,「bc cd」 ,「不」,「e」,「f」,「g」]'?? – Surya

回答

1

對於

arr = ["a", " OR ", "bc cd", " NOT ", "e"] 

方法1可以簡單地提供至陣列:大約需要O(n)的時間複雜度

new_arr = [] 
i = 0 
while i < arr.length 
break if arr[i].strip == 'NOT' # or arr[i] != ' NOT ' 
new_arr << arr[i] 
i += 1 
end 

方法2:同樣爲O(n)

new_arr = [] 
arr.each do |a| 
    break if a.strip == 'NOT' # or arr[i] != ' NOT ' 
    new_arr << a 
end 

方法3:取大約爲O(n),但是因爲索引方法必須找到的 '非' 的索引,然後得到值來形成範圍,它將運行2個後續循環。

arr[0...arr.index(' NOT ')] # NOTE 3 dots 

另外,我會避免使用方法3,如arr.index(' NOT ')如果在數組沒有​​,這將導致一個不好的範圍異常將返回零。

+0

您的複雜度估計是關閉,在最後一種情況。它仍然是O(N)。你能找到這個錯誤嗎? :) –

+1

@SergioTulentsev:增加了詳細的信息,謝謝。 :) – Surya

1

find_index

def delete_after(element, array) 
    if (ind = array.find_index(element)).present? 
    array[0...ind] 
    else 
    array 
    end 
end 

arr = ["a", " OR ", "bc cd", " NOT ", "e"] 
delete_after(' NOT ', arr) # => ["a", " OR ", "bc cd", " NOT "] 
+0

@SergioTulentsev哦,是的,它不會修改自己,謝謝:) –

+0

這不會給出預期的結果。使用3個點:'...'因爲OP想要'[「a」,「OR」,「bc cd」]',而不是''「a」,「OR」,「bc cd」,「NOT」] ' – Surya

+0

@Surya是的,我看到*旁邊的*並提供瞭解決方案,謝謝 –

4

您可以使用Array#take_while

arr.take_while { |str| str != ' NOT ' } 
#=> ["a", " OR ", "bc cd"] 
+0

海事組織,這是一個很好的答案。保持。 – Surya

+1

我們需要'take_until',爲了對稱! :) –