如何将整数数组转换为数字数组以进行进一步处理?

时间:2016-01-12 19:04:38

标签: arrays ruby string integer

我想将给定的数字分成数字和排序。我希望得到:

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”。

最初我打算找出未使用的数字,但我在第一阶段找到了使用过的数字,所以我只是复制了第一个用于查找数字的代码,并没有复制其余的代码来查找未使用的数字。我的错。道歉。

4 个答案:

答案 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]
  1. x是一个参数数组 - [2015, 8, 26]
  2. .join会将参数加入字符串并向我们提供"2015826"
  3. .chars会将字符串拆分为字符。
  4. .sort将对该字符数组进行排序
  5. .map(&:to_i)将获取每个字符并转换为数字

答案 1 :(得分:1)

TL; DR

您的问题似乎是一个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]