【发布时间】:2016-07-03 12:46:16
【问题描述】:
我正在寻找一种可以检查数组中字符串的前 n 个字符是否相同的小方法。
例如:
["Marseille", "Marsan", "Martin"].method(3) => true
["Mar", "Mar", "Mar"]
["Marseille", "Marsan", "Martin"].method(4) => false
["Mars", "Mars", "Mart"]
【问题讨论】:
我正在寻找一种可以检查数组中字符串的前 n 个字符是否相同的小方法。
例如:
["Marseille", "Marsan", "Martin"].method(3) => true
["Mar", "Mar", "Mar"]
["Marseille", "Marsan", "Martin"].method(4) => false
["Mars", "Mars", "Mart"]
【问题讨论】:
更短的版本是使用带有块的Array#uniq 和Enumerable#one?:
class Array
def same_prefix?(n)
uniq{|x| x[0, n]}.one?
end
end
【讨论】:
使用Array#map获取前缀数组:
["Marseille", "Marsan", "Martin"].map { |x| x[0,4] }
# => ["Mars", "Mars", "Mart"]
和Array#uniq 删除重复项。
["Marseille", "Marsan", "Martin"].map { |x| x[0,4] }.uniq
# => ["Mars", "Mart"]
如果所有前缀都相同,则结果应该是单个项目的数组。
class Array
def same_prefix?(n)
self.map { |x| x[0, n] }.uniq.size == 1
end
end
["Marseille", "Marsan", "Martin"].same_prefix?(3)
# => true
["Marseille", "Marsan", "Martin"].same_prefix?(4)
# => false
【讨论】:
Array 之后还要添加:same_prefix??
class Array
def same_start?(n)
start = first[0,n]
all? { |e| e[0,n] == start }
end
end
["Marseille", "Marsan", "Martian"].same_prefix?(3) #=> true
["Marseille", "Marsan", "Martian"].same_prefix?(4) #=> false
【讨论】:
这里还有另一种方法:
arr = ["Marseille", "Marsan", "Martin"]
n = 3
arr.each_cons(2).all? {|s1, s2| s1[0...n] == s2[0...n]}
#=> true
轻微的变化可以是:
arr.map{|s| s[0...n]}.each_cons(2).all? {|s1, s2| s1 == s2}
【讨论】: