Arrays 如何从数组的一部分中找出不同的元素?
我正在使用Ruby 2.4。我有一个数组,它的值如下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
['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&&…
不是nil,则执行后一部分str
匹配一个regexp并返回第一个捕获组str[regexp,1]
是一个正则表达式,它匹配斜杠后面的所有内容%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]