2013-11-26 102 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) 

的問題是,我似乎無法在所有的陣列存取權限的第一個值。

+4

哪裏這個羅德班進入圖片?你的描述說這些是數組,而不是Lod對象。這些數字是否意味着是LOD物體還是什麼? – Chuck

+0

對不起,是內部數組是從文本文件導入的Lod對象: input = File.open(「lodsedler.txt」,「r」) \t input.each do | line | (0,99999)&& l [1] .to_i. between?(1,180)&& l [2]之間的間隔爲0 [0]。 ] .to_i.between?(1,10) \t \t \t $出售<< Lod.new(L [0],L [1],L [2]) \t \t別的 \t \t \t下 \t \t結束 – 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 

編輯發表評論做:

當然這是可能的,但我相信在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 

編輯:其實更簡單,更直接...

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

感謝'.transpose' – CallmeSurge