我使用的是Ruby 2.4。我有一个字符串数组,我想添加到数组数组。例如,如果我有两个数组,
["a", "b", "c"]
["1", "2", "3"]
随着我逐渐将这些数组添加到我的数组数组中,我得到的数组数组看起来像
[["a", "1"], ["b", "2"], ["c", "3"]]
我使用下面的
来实现这一点if data_cols.size == 0
data_cols = parts
else
if parts.size > data_cols.size
num_elts = data_cols[0].size
(0..(parts.size - data_cols.size)).each do |i|
arr = Array.new(num_elts)
data_cols.push(arr)
end
end
data_cols = data_cols.zip(parts).map(&:flatten)
end
我的问题是,我怎么弄清楚我是否已经添加了一个字符串数组?所以对于isntance,如果我要添加
["a", "b", "c"]
["1", "2", "3"]
["a", "b", "c"]
结果将是
[["a", "1"], ["b", "2"], ["c", "3"]]
因为我试图添加' [" a"," b"," c"]'第二次。现在,结果是
[["a", "1", "a"], ["b", "2", "b"], ["c", "3", "c"]]
答案 0 :(得分:1)
如何判断我是否已添加字符串数组?
我们在此处检查check
是否已添加array
:
check = ["a", "b", "c"]
array = [["a", "1"], ["b", "2"], ["c", "3"]]
array.transpose.include? check #=> true
步骤:
a = array.transpose #=> [["a", "b", "c"], ["1", "2", "3"]]
a.include? check #=> true
答案 1 :(得分:1)
您可以使用一组来保留唯一的行:
require 'set'
rows = Set.new
rows << ["a", "b", "c"]
rows << ["1", "2", "3"]
rows << ["a", "b", "c"]
columns = rows.to_a.transpose
p columns
#=> [["a", "1"], ["b", "2"], ["c", "3"]]
请注意,由于Ruby 1.9,Set在内部使用Hash,因此保留了顺序(相关答案here)。使用您的版本(2.4),订单将被保留。但是,它不能保证可以在任何其他Ruby实现上工作(例如Ruby 1.8,Rubinius或JRuby)。
答案 2 :(得分:0)
您没有正确使用zip
。这是一个重新设计的,更小的版本:
data = [
["a", "b", "c"],
["1", "2", "3"],
["a", "b", "c"]
]
# Take first row of data as headers, group the rest together
headers, *rows = data
rows.map do |row|
headers.zip(row)
end.to_a
# => [[["a", "1"], ["b", "2"], ["c", "3"]], [["a", "a"], ["b", "b"], ["c", "c"]]]
它使用zip
组合了两个三元素数组,并将每一行重新制作成正确的格式。
如果您要排除重复项,可以随时使用以下方式进行预处理:
data.uniq!
在拆分标题之前执行此操作,您将不会有任何重复的条目,或者如果重复标题,则会忽略它们。
如果您只想 从数据中排除标题,那么您可以这样做:
rows.delete(headers)
有时候,当试图解决这样的简单问题时,很容易在你自己的代码中被绊倒,特别是当你违背细节并与Ruby战斗以获得解决方案时。像if data_cols.size == 0
这样的东西然后初始化它就是一个标志,你过于复杂的事情,虽然有时这些标志很容易错过。
答案 3 :(得分:0)
提前输入uniq
:
data.uniq.reduce(&:zip).map(&:flatten)