2013-11-26 6 views
-1
class Lod 

attr_accessor :lodnr 
attr_accessor :lobnr 
attr_accessor :stknr 

def initialize(lodnr, lobnr, stknr) 
    @lodnr = lodnr 
    @lobnr = lobnr 
    @stknr = stknr.chomp 
end 

def to_s 
    "%8s, %5s, %3s" % [@lodnr, @lobnr, @stknr] 
end 
end 

У меня есть массив с именем sold, который содержит эти четыре массива:Итерация по многомерному массиву?

[10000, 150, 5] 
[500, 10, 1] 
[8000, 171, 3] 
[45, 92, 4] 

Четыре массивов являются объектами класса, импортированные из в .txt.

input = File.open("lodsedler.txt", "r") 
input.each do |line| 
    l = line.split(',') 
    if l[0].to_i.between?(0, 99999) && l[1].to_i.between?(1, 180) && l[2].to_i.between?(1, 10) 
     sold << Lod.new(l[0], l[1], l[2]) 
    else 
     next 
    end 
end 

Хочет рассчитывать первое значение в каждом массиве, ищет случайно выбранный номер, который хранится в first.

Я получаю ошибку всегда что-то вроде этого, что бы я попробовать:

Undefined method xxx for #Lod:0x0000000022e2d48> (NoMethodError) 

Проблема заключается в том, что я не могу показаться, Acces первого значения во всех массивах.

+4

Где этот класс Лода войти в картину? В вашем описании говорится, что это массивы, а не объекты Lod. Действительно ли числа предназначены для того, чтобы быть объектами Лода или что? – Chuck

+0

К сожалению, внутренние массивы являются объектами Lod, импортированными из текстового файла: input = File.open ("lodsedler.txt", "r") \t input.each do | line | \t \t л = line.split ('') \t \t, если л [0] .to_i.between? (0, 99999) && л [1] .to_i.between? (1, 180) && л [2 ] .to_i.between? (1, 10) \t \t \t $ продано << Lod.new (л [0], L [1], L [2]) \t \t еще \t \t \t следующая \t \t end – Christian

ответ

6

Вы можете попробовать

a = [[10000, 150, 5], [500, 10, 1],[8000, 171, 3],[45, 92, 4]] 

Вы можете получить доступ к [0] [0] 10000 или [2] [1] 171 или итерацию

a.each do |row| 
    row.each do |column| 
     puts column 
    end 
end 

Edit для комментариев по поводу использования брекетов вместо от делать:

Конечно, это возможно, но я считаю do..end в предпочтительном: https://stackoverflow.com/a/5587403/514463

a.each { |row| 
    row.each { |column| 
     puts column 
    } 
} 
+0

можно ли печатать, используя цикл .each и блоки, не используя ключевое слово do. Что-то вроде 'a.each {| one_dimention | one_dimention.each {| number | puts number}} ' – AbhimanyuAryan

+0

Пожалуйста, подумайте о том, чтобы обновить свой ответ, если это возможно. Благодарю. – AbhimanyuAryan

2

простой способ, чтобы получить первый элемент каждого суб массива использовать транспонирование:

special_number = 45 
array = [ 
    [10000, 150, 5], 
    [500, 10, 1], 
    [8000, 171, 3], 
    [45, 92, 4] 
] 

p array.transpose.first.count(special_number) #=> 1 

Edit: На самом деле проще и прямые ...

p array.map(&:first).count(special_number) #=> 1 
+1

Спасибо за '.transpose' – CallmeSurge

Смежные вопросы