【问题标题】:How do I check if one element in an array satisfies a pattern, while the rest don't? [closed]如何检查数组中的一个元素是否满足模式,而其他元素不满足? [关闭]
【发布时间】:2017-06-25 08:47:47
【问题描述】:

我使用的是 Ruby 2.4。我知道如何检查一个字符串是否全部大写

str == str.upcase

但是如果我有一个字符串数组,有什么方法可以快速检查数组的最后一个元素是否大写,而对于其他元素,str != str.upcase 。我假设数组中至少有一个元素,如果只有一个元素并且大写,我希望我的条件评估为真。

【问题讨论】:

  • 请阅读“How to Ask”和“minimal reproducible example”。我们希望看到您的尝试,以便我们进行更正。您只给了我们一个需求列表,所以看起来您希望我们为您编写代码。
  • 您可能希望将“大写”一词替换为“仅包含大写字母”之类的内容,因为“大写”仅指单词的第一个字符。

标签: ruby-on-rails arrays ruby conditional-statements


【解决方案1】:
def only_last_upcase?(arr)
  arr.find_index { |w| w == w.upcase } == arr.size - 1
end

only_last_upcase? ["word", "wOrD", "WORD"] #=> true
only_last_upcase? ["WORD", "wOrD", "WORD"] #=> false
only_last_upcase? ["word", "wOrD", "word"] #=> false
only_last_upcase? ["word"]                 #=> false
only_last_upcase? ["Word"]                 #=> false
only_last_upcase? ["WORD"]                 #=> true
only_last_upcase? []                       #=> false

【讨论】:

  • 非常聪明!我现在为我的回答感到羞耻:)
  • 你需要修复你的正则表达式:only_last_upcase?(['Word']) #=> true
  • 谢谢,@Michael。我没有仔细阅读这个问题。我想我看到了“大写”这个词,然后从那里去了。我会修正我的答案。
  • 稍微简洁一点:arr.find_index { |str| str == str.upcase } == arr.size - 1
  • @Stefan,是的,这样更好。谢谢。我已编辑以纳入您的建议。
【解决方案2】:

Ruby 的好处是可以很容易地将问题的文本描述转化为实际代码:

def only_last_upcase?(arr)
  last_index = arr.size - 1
  arr.find_index { |s| s =~ /^[A-Z]*$/ } == last_index
end

两者都有以下结果:

only_last_upcase?(["word", "wOrD", "WORD"])
#=> true
only_last_upcase?(["WORD", "wOrD", "WORD"])
#=> false
only_last_upcase?(["word", "wOrD", "word"])
#=> false
only_last_upcase?(["word"])
#=> false
only_last_upcase?(["WORD"])
#=> true
only_last_upcase?([])
#=> false

【讨论】:

  • 您的第一个版本将每个元素与最后一个元素进行比较,因此它为["FOO", "BAR", "BAZ"] 返回true。此外,none? 不一定遍历整个数组,只要块返回真实结果,它就会返回。
  • 2 个非常好的点 @Stefan,让我在醒来后立即在 SO 上发布答案。
  • 我刚刚完全删除了第一个版本。
【解决方案3】:

仅检查一个元素满足您的条件数组的最后一个元素是否满足相同条件:

arr.one? { |str| str == str.upcase } && arr.last == arr.last.upcase

通过了 Cary Swoveland 答案中给出的所有相同测试。

【讨论】:

    【解决方案4】:

    或者,可能:

    foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1
    

    还有……

    2.3.1 :001 > foo = ["WORD","Word"]
     => ["WORD", "Word"] 
    2.3.1 :002 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1
     => false 
    2.3.1 :003 > foo = ["WORD","WORD"]
     => ["WORD", "WORD"] 
    2.3.1 :004 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1
     => false 
    2.3.1 :005 > foo = ["Word","WORD"]
     => ["Word", "WORD"] 
    2.3.1 :006 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1
     => true 
    2.3.1 :007 > foo = ["Word","WORD","WORD"]
     => ["Word", "WORD", "WORD"] 
    2.3.1 :008 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1
     => false 
    2.3.1 :009 > foo = ["WORD"]
     => ["WORD"] 
    2.3.1 :010 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1
     => true 
    2.3.1 :011 > foo = ["Word"]
     => ["Word"] 
    2.3.1 :012 > foo.last == foo.last.upcase and foo.select{|e| e == foo.last}.length == 1
     => false 
    

    【讨论】:

      【解决方案5】:

      一种方法:

      def check_only_last_upcase(arr)
          return false if arr.empty?
          arr.each_with_index do |word, index| 
              return false if word == word.upcase && index != (arr.length-1)
          end
          (arr.last.upcase == arr.last)
      end
      
      puts check_only_last_upcase(["word", "wOrD", "WORD"]) #true
      puts check_only_last_upcase(["WORD", "wOrD", "WORD"]) #false
      puts check_only_last_upcase(["word", "wOrD", "word"]) #false
      puts check_only_last_upcase(["word"]) #false
      puts check_only_last_upcase(["WORD"]) #true
      puts check_only_last_upcase([]) #false
      

      另一种方式(看起来更像红宝石方式?):

      def check_only_last_upcase(arr)
          arr.last == arr.last.upcase &&
          arr
              .slice(0,arr.length-1)
              .all? { |word| word.upcase != word }
      end
      

      最后一个建议假设arr 始终至少有一个项目(如果arr 为空,则不要返回),正如您所指出的那样。

      【讨论】:

        猜你喜欢
        • 2016-04-26
        • 2017-06-20
        • 2013-03-06
        • 2017-02-18
        • 2022-01-02
        • 2012-10-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        相关资源
        最近更新 更多