【问题标题】:Making a Ruby array string into an array of integers将 Ruby 数组字符串转换为整数数组
【发布时间】:2018-03-22 18:05:04
【问题描述】:

我有一个 ID 号数组(技术上是一个字符串)。

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"

我想把 id 做成一个如下所示的数组:

ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我发现这样做的唯一方法是使用地图。

id_numbers = ids.split(/,\s?/).map(&:to_i)

但是,这会删除数组中的第一个数字并将其替换为 0。

id_numbers = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]

有没有更好的方法将字符串数组转换为常规数组?

【问题讨论】:

  • 不是“技术上”,它一个字符串,根本不是一个数组。为什么不直接做一个数组呢?
  • eval ids 是一种方式。使用 Kernel#eval 时必须小心(出于安全原因),但它是必不可少的 Ruby 方法。
  • @CarySwoveland 使用eval 就像在雷雨中坐在山顶上。这从来都不是一个好的计划,而且很难安全地做到这一点。
  • @tadman,我喜欢这个类比,如果它是一把钢椅并且这个人戴着pickelhaube,那就更好了。

标签: arrays ruby string integer


【解决方案1】:

因为这实际上是 JSON 格式,所以答案很简单:

require 'json'

id_json = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"

ids = JSON.load(id_json)

您的解决方案“取消”第一个数字的原因是您拆分的方式。您系列中的第一个“数字”实际上是 "[1",对于 Ruby 来说它不是数字,所以它默认转换为 0。

【讨论】:

  • @lacostenycoder 虽然该解决方案确实挑选出了数量众多的部分,但它没有检测到任何可能很重要的问题。它会兴高采烈地将"INVALID DOCUMENT DO NOT READ ERROR#19" 解析为[19]
  • 感谢您的快速回复。我尝试了你的 JSON 修复,然后我开始在我的代码中遇到一些其他问题。 Cary 的建议最终对我的需求更加简单和有效,所以我可能会接受。 :)
  • @lacostenycoder JSON 与 Ruby 标准库捆绑在一起,因此它是核心。
  • @lacostenycoder 它引入了我无法解决的未指定的“问题”,否则我会。一般来说,当您拥有 JSON 数据时,您会使用 JSON 解析器,除非您有无法正常工作的特定原因。提供 Ruby 标准库是为了方便,没有理由不使用它,因为从非常狭隘的定义来看,它不是“核心”。
  • @lacostenycoder 如果它像鸭子一样走路和像鸭子一样嘎嘎叫...我非常犹豫要使用数字采摘系统的原因是因为它可能会失控,你永远不会知道.编程中最大的罪过之一是“防御性编程”,即使面对垃圾数据,你的方法也会悄悄地出错,而不是出错并提醒人们注意问题。
【解决方案2】:

如果您不想使用JSON

ids.scan(/\d+/).map(&:to_i)
  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

如果ids 可能包含负整数的字符串表示,请将正则表达式更改为/-?\d+/

【讨论】:

  • 这正是我所需要的……谢谢!
  • 如果您选择了这个答案,请记得单击答案顶部旁边的复选标记图标,以确认这是获胜答案,并将其移至顶部(并记下作者的声誉等级;)
  • 我很欣赏这个新手,但我总是建议那些刚接触 SO 的人至少等待几个小时再做出选择。快速选择可能会阻止其他答案,而且,对于那些仍在准备答案的人来说,这是不礼貌的。免费免费删除您的选择,如果您发现它比我的更有帮助,可以稍后选择另一个答案。这与@Phlip 的建议并不矛盾,因为我只解决了提问者何时应该考虑做出选择的问题。
  • @CarySwoveland 看看我的回答。你需要稍微调整一下。
  • @CarySwoveland 谢谢,目前已删除绿色复选标记。还是新手,所以我对 SO 礼仪不是很熟悉 :)
【解决方案3】:

总结一下:由于字符串开头的非数字字符,您将0 作为数组中的第一个元素:

p '[1'.to_i         #=> 0

也许有更好的方法来接收原始字符串。如果没有其他方法可以接收该字符串,您可以简单地去掉第一个字符,您自己的解决方案将起作用:

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"

p ids[1..-1].split(",").map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]

@tadman@CarySwoveland 的解决方案工作得非常好。或者:

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"

p ids.tr("^-0-9", ' ').split.map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]

请记住,&: 最早出现在 Ruby 1.8.7 中。

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 2016-01-18
    • 2019-04-21
    相关资源
    最近更新 更多