我怎么知道我是否已经在我的数组数组中添加了一个字符串数组?

时间:2017-02-13 17:31:38

标签: arrays ruby string duplicates

我使用的是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"]]

4 个答案:

答案 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)