【问题标题】:Ruby - Comparing numbers using a multidimensional arrayRuby - 使用多维数组比较数字
【发布时间】:2016-12-20 22:04:44
【问题描述】:

我正在解决一个问题,我需要将一个数字与一个数字数组进行比较,看看 4 个数字中的 3 个是否匹配。

例如:

winning_numbers = [["2537"], ["1294"], ["5142"]]

my_number = "1234"

如果比较有 3 个匹配的数字,则返回 true。如果比较小于 3 或完全匹配,则返回 false。

根据我的阅读,我正在使用一个多维数组,但是我不明白如何一次循环遍历每个数组一个数字,以便我可以将它与我的数字进行比较。

任何帮助将不胜感激。

【问题讨论】:

    标签: arrays ruby multidimensional-array iteration


    【解决方案1】:

    你可以做这样的事情来返回所有匹配的数字:

    winning_numbers.select do |number| 
      (number.first.split(//) & my_number.split(//)).size >= 3
    end
    #=> [["1294"], ["5142"]]
    

    当您只对第一个匹配的winning_number 感兴趣时,您可能想要使用find 而不是select。

    【讨论】:

    • 这在有重复数字时不起作用。例如,如果winning_numbers = [["1111"]]; my_number = "1112",则返回一个空数组,尽管[["1111"]] 是一个匹配项。
    【解决方案2】:

    如果没有重复的数字,我们可以使用数组交集:

    def triple?(winning_numbers, my_number)
      my_number_arr = my_number.chars
      winning_numbers.any? { |(w)| w.chars & my_number_arr).size == 3 }
    end
    
    winning_numbers = [["2537"], ["1294"], ["5142"]]
    my_number = "1234"
    
    triple?(winning_numbers, my_number) #=> true, matches "1294"
    

    或者,我们可以写而不是w.chars & my_number_arr).size == 3

    (w.chars - my_number_arr).size == 1 # (4-3=1)
    

    但是,当字符串有重复的数字时,这不起作用,这当然必须考虑在内。

    我have proposed 建议采用Array#difference 方法作为Ruby 核心方法。这将是完美的解决这个问题。有关其用途的示例,请参阅我在 Array#difference 的回答。

    def triple?(winning_numbers, my_number)
      my_number_arr = my_number.chars
      winning_numbers.any? { |(w)| puts my_number_arr.difference(w.chars).size == 1 }
    end
    
    winning_numbers = [["2537"], ["1294"], ["5142"]]
    my_number = "1234"
    
    triple?(winning_numbers, my_number) #=> true, matches "1294"
    

    另一个包含重复数字的例子:

    winning_numbers = [["1551"], ["1594"], ["1141"]]
    
    triple?(winning_numbers, my_number) # matches "1141"
    

    还有一个三位数不匹配的例子:

    winning_numbers = [["1551"], ["1594"], ["1561"]]
    
    triple?(winning_numbers, my_number) #=> false (no match)
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      相关资源
      最近更新 更多