2017-06-16 48 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',为了对称! :) –