2011-03-07 61 views
1

我試圖在平面數組中打印分組標題。我只想要節標題出現每組是否有Ruby-Way™來處理這種循環?

下面的例子可以工作,但是對於Ruby來說它感覺非常不雅。我敢肯定,必須有更好的方式來做到這一點;)

#!/usr/bin/ruby 
foo = [1,1,1,1,2,2,2,3,3] 

i = 0; 

f = foo[i] 
comp = f 

while(i < foo.count) do 
    puts "Section #{f}"; 

    while(f == comp) do 
    puts f 
    i += 1 
    f = foo[i] 
    end 

    comp = f 
end 

所需的輸出

Section 1 
1 
1 
1 
1 
Section 2 
2 
2 
2 
Section 3 
3 
3 

我希望有某種Array#currentArray#next實例方法,但它看起來像Ruby Array對象不保留內部迭代器。

+1

你可以通過調用'foo.to_enum'得到迭代器。它有'next'方法。 – 2011-03-07 21:19:35

+0

@Mladen,非常酷。謝謝<3 – naomik 2011-03-07 21:22:41

回答

8
foo.group_by{|e| e }.each do |header, group| 
    puts "Section #{header}" 
    puts group.join("\n") 
end 
+0

這真棒!我知道它涉及到不止一次遍歷數組,但這非常優雅:) – naomik 2011-03-07 21:16:01

+0

由於'group_by'接受一個塊,所以它對於更復雜的數據結構非常有效。 – 2011-03-07 21:42:46

+0

是的,這是完美的。我將根據日期對項目進行分組,並且該塊將使其很容易完成。再次感謝。 – naomik 2011-03-07 21:56:53

1
foo = [1,1,1,1,2,2,2,3,3] 
j = 0 
foo.each do |i| 
    unless j == i 
    puts "Section #{i}" 
    j = i 
    end 
    puts i 
end 
+0

嗯,我喜歡在這裏使用'Array#each'。這也只需要一次通過陣列。謝謝您的幫助 :) – naomik 2011-03-07 21:19:58