我有一个数组:
["apple", "banana", "animal", "car", "angel"]
我想将以"a"
开头的元素推送到单独的数组中。我想回来:
["apple"], ["animal"], ["angel"]
如果我将它们推入我预先创建的空数组中,我只能使它工作。
答案 0 :(得分:4)
通常,为了从数组中选择符合某些特定条件的元素,请使用select
方法。
select
返回一个匹配critera或空列表的所有元素的数组,以防这两个元素都没有匹配
示例:
new_array = array.select do |element|
return_true_or_false_depending_on_element(element)
end
现在,当我们想要将每个元素放在它自己的数组中时,我们可以使用另一个数组上可用的数组方法 - map
,它接受数组的每个元素并将其转换为另一个元素。在我们的例子中,我们希望获取每个匹配的字符串并将其包装在数组
map
用法:
new_array = array.map do |element|
element_transformation(element) # in order to wrap element just return new array with element like this: [element]
end
回到你的问题。为了验证字符串是否以字母开头,您可以使用start_with?
方法,该方法可用于每个字符串
将它们粘合在一起:
strings = ["apple", "banana", "animal", "car", "angel"]
result = strings.select do |string|
string.start_with?("a")
end.map do |string_that_start_with_a|
[string_that_start_with_a]
end
puts result
答案 1 :(得分:1)
这是一个高尔夫球版本:
array.grep(/\Aa/).map(&method(:Array))
在把这个聪明的东西投入生产之前我可能会考虑我的观众,因为它可能有点令人困惑。
Array#grep
返回与传递的正则表达式匹配的所有元素,在这种情况下,/\Aa/
匹配以a
开头的字符串。 \A
是与字符串开头匹配的正则表达式标记。如果您希望它不区分大小写,可以将其更改为/\Aa/i
。
&method(:Array)
位获取对内核方法Array()
的引用,并在数组的每个元素上运行它,将数组中的每个元素包装在自己的数组中。
答案 2 :(得分:0)
array_of_arrays = []
your_array.each do |ele|
if ele.starts_with?("a")
array_of_arrays << ele.to_a
end
end
答案 3 :(得分:0)
我能想到的最简单的是:
arr = %w{ apple banana animal car angel }
arr.map {|i| i.start_with?('a') ? [i] : nil }.compact
=> [["apple"], ["animal"], ["angel"]]
答案 4 :(得分:0)
以下是我在控制台中执行此操作的一些代码:
> arr = ["apple", "banana", "animal", "car", "angel"]
=> ["apple", "banana", "animal", "car", "angel"]
> a_words = []
=> []
arr.each do |word|
a_words << word if word.chars.first == 'a'
end
=> ["apple", "banana", "animal", "car", "angel"]
> a_words
=> ["apple", "animal", "angel"]
如果你想做一些比第一个字母更复杂的事情,你可能想要使用像这样的正则表达式:
if word.matches(/\Aa/) # \A is beginning of string