比较两个包含“/”的数组并保留常用元素

时间:2017-06-19 12:10:52

标签: ruby-on-rails arrays ruby

我试图比较两个包含“/”元素的数组,意思是“或”。生成的Array_3应该由Array_2中的Array_1元素组成。

Array_1 = ["A", "B", "C/D"]

Array_2 = ["B/Z", "C/D/E"]

上述情况的Array_3应为[B,C / D],因为B是B / Z(B或Z)的一部分,而C / D(C或D)是C / D / E的一部分(C或D或E)。

Array_3 = Array_1&在这种情况下,Array_2显然不起作用。此外,.split(“/”)不起作用,因为带有“/”的元素会被分解 - 我想保留原始元素“/".

1 个答案:

答案 0 :(得分:2)

您可以拆分Array_2个字符串并将它们放在一个集合中。您只需迭代Array_1的每个元素,查看set_2中是否包含任何字符串:

Array_1 = ["A", "B", "C/D"]
Array_2 = ["B/Z", "C/D/E"]

require 'set'

set_2 = Array_2.flat_map { |s| s.split('/') }.to_set
# <Set: {"B", "Z", "C", "D", "E"}>

p Array_1.select { |s| s.split('/').any? { |letter| set_2.include?(letter) } }
# ["B", "C/D"]

使用Set只是因为Set#include?Array#include?快得多,include?被多次使用。