我想将给定的数字分成数字和排序。我希望得到:
unused_digits(2015, 8, 26) # => [0,1,2,2,5,6,8]
我试过了:
def unused_digits(*x)
x # => [2015, 8, 26]
x = x.join.split "" # => [2, 0, 1, 5, 8, 2, 6]
x = x.to_a # => [2, 0, 1, 5, 8, 2, 6]
# other stuff here
return x
end
如果您对名称“unused_digits”感到困惑。请忽略名称“unused_digits”,并将其视为“find_out_used_digits”。
最初我打算找出未使用的数字,但我在第一阶段找到了使用过的数字,所以我只是复制了第一个用于查找数字的代码,并没有复制其余的代码来查找未使用的数字。我的错。道歉。
答案 0 :(得分:3)
对于评论中描述的问题,这是解决方案:
def unused_digits(*x)
x.join.chars.sort.map(&:to_i)
end
unused_digits(2015,8,26)
#=> [0, 1, 2, 2, 5, 6, 8]
x
是一个参数数组 - [2015, 8, 26]
.join
会将参数加入字符串并向我们提供"2015826"
.chars
会将字符串拆分为字符。.sort
将对该字符数组进行排序.map(&:to_i)
将获取每个字符并转换为数字答案 1 :(得分:1)
您的问题似乎是一个X / Y问题,很大程度上是因为您的方法名称(例如" unused_digits")实际上似乎与您的预期回报无关值。最初发布时,您的方法返回一个使用数字的数组,而不是未使用的数字。
如果您确实希望返回值为[0,1,2,2,5,6,8]
per your comment,则其他人已经发布了有用的答案。但是,如果您确实要返回在任何参数中使用 not 的数字(如方法名称所示),那么您可能需要尝试下面描述的替代方法。
您可以使用各种String函数展平整数数组,然后使用Array difference方法返回重复数据删除的未使用数字列表。例如:
def unused_digits *integer_array
Array(0..9) - integer_array.flatten.join.scan(/\d/).sort.map(&:to_i)
end
unused_digits 2015, 8, 26
#=> [3, 4, 7, 9]
unused_digits 2345678
#=> [0, 1, 9]
这将正确返回任何传递的参数中包含 not 的数字数组。这似乎是您的方法名称的意图,但您的里程肯定会有所不同。
答案 2 :(得分:0)
开始你的功能,你已经有了一个数组:[2015, 8, 26]
。如果这就是你想要的,那么你不需要做任何其他事情。
然后在split("")
之后直接调用join
,您将初始数组转换为字符串,然后再转换为数组。
举一个例子,这是执行交互式ruby shell irb
中基本相同的代码:
>> digits = 2015,8,26
=> [2015, 8, 26]
>> joined = digits.join
=> "2015826"
>> split = joined.split("")
=> ["2", "0", "1", "5", "8", "2", "6"]
>> split.to_a
=> ["2", "0", "1", "5", "8", "2", "6"]
>> split.class
=> Array
如您所见,当您致电join
时,您的2015,8,26
会变成"2015826"
,这是一个字符串。调用split""
后,它将成为一个数组,其中每个字符作为数组中的单独元素。
对已经是数组的内容调用to_a
无效。
希望这有用!
答案 3 :(得分:0)
def unused_digits(*x)
x.flat_map { |n| n.to_s.each_char.map(&:to_i) }.sort
end
unused_digits(2015,8,26)
#=> [0,1,2,2,5,6,8]