2016-07-05 126 views
1

我想對給定的字符串執行更深的數組方法。假設我有str = "hello world"ruby​​將字符串拆分成數組然後將數組元素拆分成單詞

我可以使用str.split(" ")將其拆分。但我的預期目標是把"hello"["h", "e", "l", "l", "o"]"world"["w", "o", "r", "l", "d"]所以我可以做我的選擇的陣列的方法(比如第一交換和最後一個字母["o", "e", "l", "l", "h"],然後返回它放回["oellh", "dorlw"],最後把他們重新走到一起"oellh dorlw"

這只是一個示例方法,我希望應用幾種不同的數組方法,但它只適用於將字符串拆分爲單詞數組並進一步拆分爲元素數組(str.chars不是我所期待的) 。我嘗試了str.split(" ").each {|arr| arr.split("")},但它不起作用。將字符串拆分爲數組並將該數組拆分爲元素數組,應用方法並將它們加回來的最佳方法是什麼nto字符串?

+0

使用'join'加入字符串數組。如果你不想使用'chars',那麼可以使用'str.split('')',但是這也包括空格。 –

回答

2
"hello world".split.map { |word| word[-1] + word[1..-2] + word[0] }.join(' ') 
=> "oellh dorlw" 
+0

非常簡單和優雅的解決方案。 –

+0

非常感謝:) – Ursus

1

爲了生產["oellh", "dorlw"]你可以寫

str.split(" ").map{|arr| arr.reverse} 

要產生一個數組的數組一樣

[["H", "e", "l", "l", "o"], ["w", "o", "r", "l", "d"]] 

你可以做

str.split(" ").map{|arr| arr.split("")} 
2

這是一個非常簡單的事情去做:

'hello world'.split.map{ |s| 
    s[0], s[-1] = s[-1], s[0] 
    s 
} # => ["oellh", "dorlw"] 
.join(' ') # => "oellh dorlw" 

您不需要創建單詞字符的中間數組,這是CPU的浪費。相反,s[0], s[-1] = s[-1], s[0]正在使用並行分配來交換第一個和最後一個字符。

一旦你有了反轉字的數組,那麼join(' ')會再次返回到一個字符串。

你可以使用[...] * ' '來完成同樣的事情,但它不是那麼地道:

["oellh", "dorlw"] * ' ' # => "oellh dorlw" 

如何工作是留給你要弄清楚。

如果要將字符串轉換爲其字符,您可以使用使用split('')chars可用,並且會做同樣的事情:

'hello world'.split.map(&:chars) # => [["h", "e", "l", "l", "o"], ["w", "o", "r", "l", "d"]] 

chars應該是一點點更快,因爲紅寶石沒有弄清楚傳遞給split什麼參數。

您可以在該點摺疊,旋轉或切斷所有你想要的東西。

我建議讀幾遍Ruby類文檔。它會幫助您瞭解可用的方法,以便您可以快速搜索這些內容。

2

你幾乎都有自己的答案,你只是稍微偏離:

str = "hello world" 
=> "hello world" 
str.split(" ").map { |s| s.split("") } 
=> [["h", "e", "l", "l", "o"], ["w", "o", "r", "l", "d"]] 

使用map而不是each

反向:

a = str.split(" ").map { |s| s.split("") } 
=> [["h", "e", "l", "l", "o"], ["w", "o", "r", "l", "d"]] 
a.map { |s| s.join }.join(" ") 
=> "hello world"