Arrays 如何从数组的一部分中找出不同的元素?

Arrays 如何从数组的一部分中找出不同的元素?,arrays,ruby,unique,distinct,Arrays,Ruby,Unique,Distinct,我正在使用Ruby 2.4。我有一个数组,它的值如下 ['1/ 8', '5 / 16', nil, '12 / 25', nil, '8/9'] 我的问题是,当数组中的元素不是nil时,如何计算“/”后面的所有唯一值?您可以假设数组中的所有值要么是nil,要么是一个“/”,后跟一定程度的空格,然后是一个数字。如果我正确理解您的问题,您需要从'1/8'中取出8(或'8'?): a = ['1/ 8', '5 / 16', nil, '12 / 25', nil, '8/9'] a.compac

我正在使用Ruby 2.4。我有一个数组,它的值如下

['1/ 8', '5 / 16', nil, '12 / 25', nil, '8/9']

我的问题是,当数组中的元素不是
nil
时,如何计算
“/”
后面的所有唯一值?您可以假设数组中的所有值要么是
nil
,要么是一个
“/”
,后跟一定程度的空格,然后是一个数字。

如果我正确理解您的问题,您需要从
'1/8'
中取出
8
(或
'8'
?):

a = ['1/ 8', '5 / 16', nil, '12 / 25', nil, '8/9']
a.compact.each_with_object({}) do |str, hash|
  hash[str] = str.split('/').last.split(' ').map(&:to_i).uniq
end
#=> {"1/ 8"=>[8], "5 / 16"=>[16], "12 / 25"=>[25], "8/9"=>[9]}
如果只需要获取uniq值:

values = a.compact.flat_map {|str| str.split('/').last.split(' ').map(&:to_i) }.uniq
#=> [8, 16, 25, 9]

使用Eli的建议使用rational类型:

a.compact.map{|f| f.delete(' ').to_r}.map(&:denominator).uniq
编辑:请注意,这是基于这些是分数的假设(因此
to\r
将适用)。

试试这个

arr.map { |str| str && str[%r{/(.*)}, 1].to_i }
# => [8, 16, nil, 25, nil, 9]
这是怎么回事

  • map
    是一个将结果收集到新数组中的循环
  • str&&…
    如果
    str
    不是nil,则执行后一部分
  • str[regexp,1]
    匹配一个regexp并返回第一个捕获组
  • %r{/(.*)}
    是一个正则表达式,它匹配斜杠后面的所有内容

    • 我已经逐字解释了这个问题

      arr = ['1/ 8', 'dog/ 25', nil, '12 / 25', nil, '8/9', '1/2 5', '1 / cat', '2/', '3 4']
      
      arr.map { |obj| obj.to_s[/(?<=\/).*/] }.compact.uniq
        #=> [" 8", " 25", "9", "2 5", " cat", ""]
      
      arr=['1/8','dog/25','nil','12/25','nil','8/9','1/25','1/cat','2/','34']
      arr.map{| obj | obj.to_s[/(?[“8”、“25”、“9”、“25”、“2”、“5”、“cat”、“”]
      
      正则表达式匹配正斜杠后面的所有字符,正斜杠以正向查找方式匹配


      注意
      nil.to#s#=>'

      看起来您正在使用理性,因此您可以使用:

      注意,有理数是不可约的:


      您将获得
      [3]
      作为
      ['4/6','1/3'的唯一分母
      ,这取决于您的需要,可能是一个功能或一个bug。

      另外,作为一条建议,您可能希望使用Ruby的rational type来实现这一点。您可以阅读更多内容。您已经尝试了什么?当您发布到目前为止尝试的内容时,更容易理解问题和帮助。嗨,谢谢。Whe是否存储了唯一的值?当我运行“puts”{a}时,它会打印出数组,就好像它没有变化一样。Nice。表达式“values=a.compact.flat_map{str | str.split('/')。last.split('')。map(&:to_I).uniq}”实际上返回非唯一项(例如[24,40,24,40])但是当我运行values.uniq之后,它返回了一个只包含唯一值的数组。@Natalia你没有说你需要结果数组是uniq,你只是在
      /
      :)之后提到了你需要字符串的uniq数,但很好,你找到了你需要的(不过我编辑了答案)。问题涉及“/”后面的唯一值,而不是唯一的数字。从字面上看,它们是唯一的字符串,但询问者可能想要“值”娜塔莉亚,你需要在措辞上精确,不仅仅是在SO问题上,而是在你所有的编码工作中。不错!但是如果我们在OP中看到的是与理性相似的巧合,那么就会失败,并且有
      “1/23”
      (它将返回
      23
      ,而不是
      2
      3
      )。但毕竟,我不知道OP到底想要什么,所以;p@AndreyDeineko你是对的,这是我的回答所基于的评论中的一个假设。我可能应该提到它。
      array = ['1/ 8', '5 / 16', nil, '12 / 25', nil, '8/9']
      
      rationals = array.compact.map do |string|
        Rational(string.delete(' '))
      end
      #=> [(1/8), (5/16), (12/25), (8/9)]
      
      unique_denominators = rationals.map(&:denominator).uniq
      #=> [8, 16, 25, 9]