【问题标题】:After using .flatten, identical strings aren't equal to each other使用 .flatten 后,相同的字符串不相等
【发布时间】:2021-01-29 14:03:24
【问题描述】:

晚上好。我有一个嵌套的名称数组。调用特定索引并使用 == 返回 true。使用 .flatten 后,在相同的值上使用 == 会返回 false。

name_array
=> [["Theo", "Peter Jr.", "Lucky"], ["Theo", "Peter Jr.", "Ms. K"], ["Queenie", "Andrew", "Ms. K", "Alex"], ["Queenie", "Alex"]]
irb(main):044:0> name_array[0][0]
=> "Theo"
irb(main):045:0> name_array[1][0]
=> "Theo"
irb(main):046:0> name_array[0][0] == name_array[1][0]
=> true
irb(main):047:0> name_array.flatten
=> ["Theo", "Peter Jr.", "Lucky", "Theo", "Peter Jr.", "Ms. K", "Queenie", "Andrew", "Ms. K", "Alex", "Queenie", "Alex"]
irb(main):048:0> name_array[0] == name_array[3]
=> false

这里的最终目标是返回一个唯一名称的数组。 我的第一直觉是使用.uniq,但这最终会返回原始的嵌套数组。应该注意的是,我首先通过将嵌套哈希转换为数组然后将数组值添加到 name_array 来获得这个嵌套数组。

irb(main):051:0> name_array.flatten
=> ["Theo", "Peter Jr.", "Lucky", "Theo", "Peter Jr.", "Ms. K", "Queenie", "Andrew", "Ms. K", "Alex", "Queenie", "Alex"]
irb(main):052:0> name_array.uniq
=> [["Theo", "Peter Jr.", "Lucky"], ["Theo", "Peter Jr.", "Ms. K"], ["Queenie", "Andrew", "Ms. K", "Alex"], ["Queenie", "Alex"]]

【问题讨论】:

  • 您的预期输出是什么?因为 IMO 所有数组都不同,所以所有数组都应该返回。我错了?你期待不同的结果吗?
  • Ruby 总是返回最后执行的函数的值,这就是irb 打印的内容。当您执行name_array.flatten 时,它会返回一个新的扁平数组,irb 会打印结果。展平的数组没有分配给任何变量,一旦超出范围就会被丢弃。 name_array 仍然保持原始值。使用name_array.flatten.uniq 获得您想要的结果。但是您仍然需要将结果分配给变量...

标签: arrays ruby multidimensional-array


【解决方案1】:

这里的主要问题是#flatten返回一个新数组,而不是改变原来的数组。

解决它有两种方法:

  1. 用调用#flatten后返回的数组定义一个新变量
flatten_array = name_array.flatten

flatten_array[0] == flatten_array[3]
=> true
  1. 使用#flatten!,改变原始数组:
name_array.flatte!

name_array[0] == name_array[3]

#uniq,改变原来的用法:#uniq!

总结:解决你所需要的:

name_array.flatten!
name_array.uniq # or .uniq!

# OR

flatten_array = name_array.flatten
flatten_array.uniq # or .uniq!

还有一个技巧,使用:#inject#|

name_array.inject(&:|) # will do the same as name_array.flatten.uniq

附:这是您第二个遇到同样问题的问题,我认为this 可能会帮助您了解它是如何工作的“:) 一般来说:带有感叹号(!)的方法会改变你原来的变量值,没有感叹号(!)的方法会返回一个新值

【讨论】:

    猜你喜欢
    • 2014-07-15
    • 1970-01-01
    • 2012-09-11
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多