【问题标题】:Remove items (superstrings) from array where a substring exists as another item从数组中删除子字符串作为另一个项目存在的项目(超字符串)
【发布时间】:2015-12-29 13:08:11
【问题描述】:

我正在尝试过滤一个数组,我想在其中排除任何在数组中具有“子字符串”的内容。 这是为了创建一个搜索词数组,但限制重复搜索的数量。

[ "Rough Collie", "Alsatian", "Standard Poodle", "Poodle", "Collie", "Schnauser", "Border Collie", "Chihuahua" ]
=>
[ "Alsatian", "Poodle", "Collie", "Schnauser", "Chihuahua" ]

我们删除了标准贵宾犬,因为贵宾犬是匹配的,而粗犷牧羊犬和边境牧羊犬是因为牧羊犬是匹配的。 即,如果一个词存在,但在另一个术语中也作为子字符串存在,则删除较长的术语。

arr - arr.map { |a| arr.select { |s| s.include?(a) && s != a}}.flatten

这基本上可以工作,但看起来有点难看。有没有更优雅的方法来做到这一点?

【问题讨论】:

    标签: arrays ruby string


    【解决方案1】:

    建议:

    arr.delete_if{|c|
      arr.any? { |s| c != s && c.include?(s) }
    }
    

    arr 将被原地修改,从而节省内存分配

    【讨论】:

    • 这就是我所追求的。可能值得添加一个 uniq!条款如下所示。我会进行编辑。
    • 如果 arr = ["a", "cat"] 您的方法返回 ["a"]。您可以通过将内部块更改为 { |s| c!=s && c =~ /\b#{s}\b/ }\b 是一个分词)来解决这个问题。请注意,允许arr = ["b c", "a b c"] 返回["b c"],正如我所期望的那样。此外,与 OP 的代码不同,delete_if(又名reject!)会改变arr。您可以使用reject 而不是delete_if 来避免这种情况。
    【解决方案2】:

    另一种方式可以如下:

    arr.uniq!
    arr.reject { |ar| arr.select { |another| ar.include? another }.count >= 2 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-06
      • 2021-12-28
      • 2018-04-14
      • 2021-03-31
      • 1970-01-01
      • 2015-09-27
      • 2012-04-17
      • 2022-11-12
      相关资源
      最近更新 更多