【问题标题】:How to filter array of strings如何过滤字符串数组
【发布时间】:2016-01-11 10:39:47
【问题描述】:

我正在尝试隔离数组中的某些字符串,例如,

["banana man", "apple", "banana woman"]

可以通过字符串的开头(即子字符串)来识别。我想保留'banana man''banana woman',但删除'apple'。任何帮助将不胜感激。

【问题讨论】:

  • 您提前知道前缀(例如"banana")还是必须从给定的字符串中提取/识别它?
  • 问题一点都不清楚。 "apple" 以哪种方式与其他两个元素隔离?是不是因为它以"a"开头?
  • Beth,如果 a 是您的数组并且我们按字面意思解释您的问题(正如我们应该的那样),a.delete("apple") 就足够了(尽管我怀疑这就是您要寻找的东西)。
  • "Bananaman" 是一个词。还有一个Banana Kid
  • 问题是当我卷曲 URL 时返回了一大堆 html,而我想要的只是那个混乱中的对象名称。

标签: arrays ruby string substring


【解决方案1】:

这是grep 的一个很好的用例

ary = ["banana man", "apple", "banana woman"]
ary.grep(/^banana/) # => ["banana man", "banana woman"]

【讨论】:

  • 虽然 grep 的表达式看起来很简单,但基准测试表明它的成本很高。
  • 谢谢,效果很好,程序的性能问题还没有被提出,所以我会继续使用 grep。
【解决方案2】:

尝试start_with?select 只选择以您想要的字符串开头的那些:

["banana man", "apple", "banana woman"].select { |i| i.start_with?("bana") }
=> ["banana man", "banana woman"]

【讨论】:

    【解决方案3】:

    基准时间:

    require 'fruity'
    
    ARY = ["banana man", "apple", "banana woman"]
    
    ARY.grep(/^banana/) # => ["banana man", "banana woman"]
    ARY.select { |i| i.start_with?("bana") } # => ["banana man", "banana woman"]
    
    compare do
      grep_only { ARY.grep(/^banana/) }
      select_start_with { ARY.select { |i| i.start_with?("bana") } }
    end
    # >> Running each test 4096 times. Test will take about 1 second.
    # >> select_start_with is faster than grep_only by 3x ± 1.0
    

    扩展ARY:

    ARY = ["banana man", "apple", "banana woman"] * 1000
    
    compare do
      grep_only { ARY.grep(/^banana/) }
      select_start_with { ARY.select { |i| i.start_with?("bana") } }
    end
    # >> Running each test 8 times. Test will take about 1 second.
    # >> select_start_with is faster than grep_only by 3x ± 0.1
    

    【讨论】:

    • 感谢您的基准测试。有趣的是,我能找到的下一个最快的方法(〜半速)实际上是加入和扫描(根据规格,这似乎容易出错)。
    • 然后将其添加到混合中。这是一个社区 wiki 是有原因的。
    【解决方案4】:

    在 Tin Mans 的要求下,由于您的实际规格非常模糊,我将添加此替代解决方案作为可能但可能容易出错的选项。

    ARY = ["banana man", "apple", "banana woman"] 
    ARY.join('  ').scan(/banana\s\w+/)
    #=> ["banana man", "banana woman"]
    

    这将优于 grep,但速度大约是 selectstart_with? 组合的一半,并且完全基于帖子而不是您潜在的潜在意图。

    【讨论】:

      猜你喜欢
      • 2019-05-02
      • 2017-07-15
      • 2022-07-04
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      相关资源
      最近更新 更多