直接分配映射数组

时间:2011-03-26 22:54:30

标签: ruby

尝试将我从文件中读取的内容映射到 具有整数和字符串

的数组列表

似乎没有正常工作,因为我看到了 每个数组两个字符串,而不是整数 和一个字符串。

list_of_elems = []
File.foreach("line_counts.txt") do |line|
  list_of_elems << arr = line.split(/\s+/).map! { |e, i| i == 0 ? e.to_i : e }
end

list_of_elems.each_with_index do |e, i|
  if i > 10
    break
  end
  p e
end

4 个答案:

答案 0 :(得分:1)

如果我理解得很好,你想要这样的文件:

test 20 foo
7 1 bar 6

得到这个:

[["test", 20, "foo"],
 [7, 1, "bar", 6]]

右?

然后你可以使用:

list_of_elems = []
File.foreach("line_counts.txt") do |line|
  list_of_elems << line.split(/\s+/).map {|e| e =~ /^(?:+|-)?\d+$/ ? e.to_i : e }
end

或者:

list_of_elems = File.read("line_counts.txt").split("\n").map do |line|
  line.split(/\s+/).map {|e| e =~ /^(?:+|-)?\d+$/ ? e.to_i : e }
end

答案 1 :(得分:1)

这可能不太相关,但

list_of_elems.each_with_index do |e, i|
  if i > 10
    break
  end
  p e
end

可以替换为

list_of_elems[0..10].each {|e| p e}

答案 2 :(得分:0)

你的问题是map!只将一个参数传递给块;因此i总是nili == 0总是失败,永远不会调用to_i。我想你想要更像这样的东西:

list_of_items = File.open('line_counts.txt').collect do |line|
    line.split(/\s+/).inject([ ]) { |a, e| a.push(a.length == 0 ? e.to_i : e) }
end

a.length == 0基本上取代了您错误的i == 0检查,并将该行的第一个组成部分转换为整数。

如果linecounts.txt看起来像这样:

1 one
2 two

然后list_of_items看起来像这样:

[[1, "one"], [2, "two"]]

这似乎就是你所追求的目标。

答案 3 :(得分:0)

这也应该有效:

list_of_elems = File.foreach("line_counts.txt").map |line|
  line.split.map.with_index { |e, i| i == 0 ? e.to_i : e }
end

我使用map代替每个输出,因为你可以在textmate中按Tab键两次,然后为你构建块。

list_of_elems.map { |e| puts e.to_s }