Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 根据数组本身的内容筛选字符串数组_Arrays_Ruby_String - Fatal编程技术网

Arrays 根据数组本身的内容筛选字符串数组

Arrays 根据数组本身的内容筛选字符串数组,arrays,ruby,string,Arrays,Ruby,String,如何删除字符串数组中另一个字符串的所有子字符串?我想要这个字符串数组: arr = ["Bochum", "Stu", "Stut", "Stuttt", "Stutt", "Stuttgart", "Heesestr.", "Berl", "Berlin"] 缩小到: ["Bochum", "Stuttt", "Stuttgart", "Heesestr.", "Berlin"] 编辑: 秩序不需要维持。如果有帮助的话,可以对元素进行排序 假设arr是唯一的,没有DUP 如果你不反对使用

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

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

["Bochum", "Stuttt", "Stuttgart", "Heesestr.", "Berlin"]
编辑:

  • 秩序不需要维持。如果有帮助的话,可以对元素进行排序
  • 假设
    arr
    是唯一的,没有DUP

如果你不反对使用暴力:

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"] 
arr=[“波鸿”、“斯图”、“斯图尔特”、“斯图尔特”、“斯图尔特”、“斯图加特”,
“Heesestr.”、“Berl”和“Berlin”]
arr.each_与_对象([]){str,a|
str.size}
#=>[“波鸿”、“斯图尔特”、“斯图加特”、“希塞斯特”、“柏林”]

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

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

类LossyTrie
def初始化@dict={};结束
def添加(str)
#将新字符串拆分为字符,在每一步遍历trie。
#作为一个副作用,如果str的前缀已经存在,它将被遗忘。
#类似地,如果str本身是现有字符串的前缀,则不会发生任何更改。
dict=@dict
str.each|char do|c|
dict=(dict[c]| |={})
结束
结束
定义所有_字符串
strs=[]
def遍历(dict、至今和块)
对于dict中的k,v
如果v.empty?
阻塞呼叫(到目前为止+k)
其他的
导线测量(v、至今+k和块)
结束
结束
结束
特拉弗斯(@dict,“”){leaf | strs[“波鸿”、“柏林”、“斯图尔特”、“斯图加特”、“希塞斯特”。]

不需要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}

不保留顺序的解决方案:

["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
一个带有Sort、Grep和Count的行程序 假设数组元素总是以相同的字母开头,删除子字符串的一种方法是排序,排序将首先放置较短的元素。然后可以拒绝在数组中较深位置具有较长匹配项的元素。例如:

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"]

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

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

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
ar=[“波鸿”、“斯图”、“斯图尔特”、“斯图尔特”、“斯图尔特”、“斯图加特”、“希塞斯特”、“柏林”、“柏林”]
子_字符串=[]
ar.collect do|string|
对于0…string.length中的索引

sub_字符串是的,那应该是
my_array
。我试图清理变量名,但漏掉了一个…抱歉..如果数组包含
ochu
?一个小建议:在给出示例时,为每个输入对象分配一个变量(例如,
arr=[“Bochum”,…])。这样读者就可以引用这些变量了(例如,
arr
)在评论和答案中,而不必定义它们。当你在答案发布后编辑你的问题时,最好留下你的问题并添加到其中,明确它是一个编辑(例如,“编辑:…”)。如果你不这样做,你可能会使答案或评论不正确或没有意义。顺便说一句,你没有回答我的问题。一个可能的边缘问题:如果
arr=[“Stu”,“Stu”]
它返回一个空数组。我说“可能”因为我不知道OP在这种情况下想要什么,甚至不允许DUP。对你的回答做一个小小的调整,让我决定使用:
array.sort.select{elem}array.grep(/\A{elem}/.one}
@CarySwoveland谢谢你!因为它,有太多客观的C代码了。
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