【问题标题】:How can I convert an array of integers into an array of digits for further processing?如何将整数数组转换为数字数组以进行进一步处理?
【发布时间】:2016-01-12 19:04:37
【问题描述】:

我想将给定的数字分解为数字并排序。我希望得到:

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

本来我是要找出未使用的数字,但我在第一阶段卡住了寻找使用的数字,所以我只是复制了第一个寻找数字的代码,并没有复制其余的代码来寻找未使用的数字。我的错。道歉。

【问题讨论】:

  • unused_digits(2015,8,26) 的预期输出是什么?
  • *x 意味着,无论您传递多少(数量)个参数 - x 都是一个数组
  • 我想打破每个数字并进行排序。所以输出将是 [0,1,2,2,5,6,8] @WandMaker
  • 未来访问者的注意事项:这个问题已经被几个人大量编辑,以提高可读性和清晰度。请在查看答案时牢记这一点。
  • 当方法返回使用的数字时,为什么调用unused_digits

标签: arrays ruby string integer


【解决方案1】:

对于cmets中描述的问题,解决方法如下:

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) 将获取每个字符并转换为数字

【讨论】:

  • 认为您可以错过第 2 步并获得相同的输出?
  • @sagarpandya82 是的!谢谢,会更新答案
【解决方案2】:

TL;DR

您的问题似乎是 X/Y 问题,很大程度上是因为您的方法名称(例如“unused_digits”)实际上似乎与您的预期返回值没有任何关系。正如最初发布的那样,您的方法返回 used 数字而不是 unused 数字的数组。

如果您确实希望返回值为[0,1,2,2,5,6,8]per your comment,那么其他人已经发布了有用的答案。但是,如果您确实想要返回任何参数中未使用的数字(如您的方法名称所建议的那样),那么您可能需要尝试下面描述的替代方法。

用数组差异查找未使用的数字

您可以使用各种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]

这将正确返回一个包含在任何传递的参数中的数字数组。这似乎是您的方法名称的意图,但您的里程肯定会有所不同。

【讨论】:

  • 感谢您帮助我编辑原始帖子。我的错。道歉。本来我是要找出未使用的数字,但是我在第一阶段卡住了寻找使用的数字,所以我只是复制了第一个代码,并没有复制其余的代码来查找未使用的数字。
【解决方案3】:

开始你的函数,你已经有一个数组:[2015, 8, 26]。如果这就是您想要的,那么您无需执行任何其他操作。

通过在join 之后直接调用split(""),您将初始数组转换为字符串,然后再转换回数组。

举个例子,这是执行与irb(交互式 ruby​​ shell)中基本相同的代码:

>> 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"" 后,它变成一个数组,其中each 字符作为数组中的一个单独元素。

对已经是数组的内容调用 to_a 无效。

希望对您有所帮助!

【讨论】:

  • 你是对的!谢谢 !我不知道何时传递多个参数,然后它将自动成为一个数组。我试图在......之后整理数组。
【解决方案4】:
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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2019-03-29
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2021-06-14
    相关资源
    最近更新 更多