присвоение сопоставленного массива напрямую - PullRequest
0 голосов
/ 27 марта 2011

Попытка отобразить то, что я прочитал из файла, в список массивов, которые имеют целое число и строку

Кажется, это не совсем правильно, потому что я вижу две строки в массиве, а не целое число и строка.

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 ]

1 голос
/ 28 марта 2011

Это может быть не слишком актуально, но

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}
1 голос
/ 27 марта 2011

Если я хорошо понимаю, вы хотите взять файл, подобный этому:

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
0 голосов
/ 27 марта 2011

Это тоже должно работать:

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

Я использую карту вместо каждого для вывода, потому что вы можете дважды нажать на tab в textmate, и он создаст блок для вас.

list_of_elems.map { |e| puts e.to_s }
0 голосов
/ 27 марта 2011

Ваша проблема в том, что map! передает только один аргумент в блок;следовательно, i всегда nil, i == 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"]]

и это, похоже, то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...