2017-06-26 52 views
-2

我得到這個數組:如何在Ruby中嵌套數組中的數字?

array = [["R.M", 20], ["R.U-CS", 3], ["R.M-TIC", 3], ["R.J.CONF", 20]] 

sum的數值,所以我已經轉換此成一個單一的陣列,通過使用flatten

array = array.flatten 
#=> ["R.M", 20, "R.U-CS", 3, "R.M-TIC", 3, "R.J.CONF", 20] 

然後:

a = [] 
array.each do |r| 
    a << r if r.class == Fixnum 
end 
a 

這可行,但我正在尋找一個更簡單的解決方案,可能首先將數組轉換爲「僅有的numeric」數組:

[20, 3, 3, 20] 
+1

你可以,例如。結合'選擇'與'is_a?' –

+0

謝謝:),它適用於我 –

+0

你有什麼問題的代碼?你的代碼有什麼問題?你有錯誤信息嗎?什麼是錯誤信息?你得到的結果不是你期待的結果嗎?你期望得到什麼結果?爲什麼?你得到的結果是什麼?兩者有什麼不同?你正在觀察的行爲不是所期望的行爲?什麼是期望的行爲,爲什麼,觀察到的行爲是什麼,以及它們以何種方式不同?請提供[mcve]。 [所以]不是「寫我的代碼給我的服務」!如果您正在尋找*那*,聘請程序員。 –

回答

14

不是很明顯,但是你可以通過一個類或模塊來grep選擇它的實例:

array.grep(Integer) 
#=> [20, 3, 3, 20] 

array.grep(Numeric) 
#=> [20, 3, 3, 20] 

grep_v排除其實例:

array.grep_v(String) 
#=> [20, 3, 3, 20] 

這可行,因爲grep使用===進行模式匹配。如果你傳遞一個類,它調用Module#===(每類模塊)如果對象是接收器的一個實例,它返回true

Integer === 20 
#=> true 

Integer === 'foo' 
#=> false 

然而,您的實際問題可以多得到解決更輕鬆。鑑於這種陣列:

array = [["R.M", 20], ["R.U-CS", 3], ["R.M-TIC", 3], ["R.J.CONF", 20]] 

並假設第二值始終是一個號碼,則可以使用sum與塊:

array.sum { |string, number| number } 
#=> 46 

或總結每個子陣列的last值:(這是在這種情況下,相同)

array.sum(&:last) 
#=> 46 
+2

這個!我永遠忘記了這個美好的'grep'。 **這是正確的答案,並應標明** – mudasobwa

+4

@mudasobwa:有很多種方法對皮膚一隻貓:) –

+1

@SergioTulentsev yes和no。爲了讓這隻貓開心,應該使用最可讀的方式來完成任務。就是這個。 – mudasobwa

1
array.delete_if { |x| x.kind_of(String) } 
0

按照下面的代碼

array.reject { |c| c.class.name.eql?('String') } 

隨着is_a?

array.reject { |c| c.is_a?(String) } 
+2

爲什麼類名檢查而不是'is_a?'? –

+0

我們可以同時使用@SergioTulentsev –

+0

除了一個錯誤:) –

1
array.map { |item| item if item.is_a? Integer }.compact 

# [20, 3, 3, 20] 

更緊湊:

array.select { |item| item.is_a? Integer } 

或者更短:

array.select &Integer.method(:===) 
+1

你在這裏誤用'map'。 –

+0

'map.compact'比'select'多一個循環。 – mudasobwa

+0

你的'select'塊中的'item if'部分是多餘的。 – Stefan

0

使用select如果你想永久改變你的變量array與只整數內容從數組

array = ["R.M", 20, "R.U-CS", 3, "R.M-TIC", 3, "R.J.CONF", 20] 
array.select { |tmp| tmp.is_a?(Integer) } 
#=> [20, 3, 3, 20] 

使用select!只選擇整數內容

+0

Ruby不是Python或Java。當'select'足夠時,無需編寫'select()'。 –

+0

@EricDuminil點指出..從'Enumerable'一些其他方法,如'注入({})'需要在args ..所以括號只是滑動,只是使用枚舉方法 – sa77

+2

是。請注意'inject'並不總是需要一個參數。 –

3

人們可能會使用類'case-equality Module#===來確定一個元素類並拒絕字符串:

array = ["R.M", 20, "R.U-CS", 3, "R.M-TIC", 3, "R.J.CONF", 20] 
array.reject &String.method(:===) 
#⇒ [ 
# [0] 20, 
# [1] 3, 
# [2] 3, 
# [3] 20 
# ] 
+0

哇,謝謝你的提示! –

0

如果您陣列格式應該是你的榜樣,那麼這將工作:

array.select.with_index { |_,i| i.odd? } #=> [20, 3, 3, 20]