根据数组本身的内容过滤字符串数组

时间:2016-01-07 03:05:53

标签: arrays ruby string

如何删除字符串数组中另一个字符串的所有子字符串?我想要这个字符串数组:

arr = ["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart", "Heesestr.", "Berl", "Berlin"]

缩小为:

["Bochum", "Stuttt", "Stuttgart", "Heesestr.", "Berlin"]

编辑:

  • 不需要保留订单。如果它有帮助,对元素进行排序很好。
  • 假设arr是唯一的,没有重复。

6 个答案:

答案 0 :(得分:2)

如果你不反对使用蛮力:

arr = ["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart",
       "Heesestr.", "Berl", "Berlin"]

arr.each_with_object([]) { |str,a|
  a << str unless arr.any? { |s| s.include?(str) && s.size > str.size } }
  #=> ["Bochum", "Stuttt", "Stuttgart", "Heesestr.", "Berlin"] 

答案 1 :(得分:0)

这是使用类似Trie的数据结构的实现。它通过简单地丢失信息来实现目标: - )

(我假设你只关心彼此的前缀的字符串,而不是子字符串......)

cdr

答案 2 :(得分:0)

不需要Rails,普通Ruby会这样做:

my_array =["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart", "Heesestr.", "Berl", "Berlin"]

my_array.keep_if {|x| my_array.join(",").scan(x).length == 1}

答案 3 :(得分:0)

不保留订单的解决方案:

["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart",
   "Heesestr.", "Berlin", "Berl"].sort_by(&:size).reduce([]) do |ary, word|
  ary.reject{|s| word.include?(s)}.push(word)
end

答案 4 :(得分:0)

具有排序,Grep和计数的单行

假设您的数组元素始终开头,则删除子字符串的一种方法是排序,这将首先放置较短的元素。然后,您可以拒绝在数组中更深匹配的元素。例如:

array = %w[Bochum Stu Stut Stuttt Stutt Stuttgart Heesestr. Berl Berlin]
array.sort.reject { |elem| array.grep(/\A#{elem}/).count > 1 }
#=> ["Berlin", "Bochum", "Heesestr.", "Stuttgart", "Stuttt"]

如果您的阵列不应该排序,那么这不是适合您的解决方案。但是,它肯定包含正确的数组元素,并且既简短又易于阅读。您的里程可能会有所不同。

答案 5 :(得分:0)

找到子字符串并删除它们,可能不是很好但很清楚

ar = ["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart", "Heesestr.", "Berl", "Berlin"] 
sub_strings = []
ar.collect do |string|
  for index in 0...string.length
    sub_strings << string[0...index] if ar.include?(string[0...index]) 
  end
end
results = ar - sub_strings