我有以下(工作)代码我正在尝试使用#map或#select转换为更简洁的代码段。
def duplicate_string(string)
s_list = []
string.downcase.chars.each do |char|
if string.index(char) != string.rindex(char) && s_list.include?(char) == false
s_list << char if char != ' '
end
end
s_list
end
puts duplicate_string("I am a duplicate string") == ["i", "a", "t"] #true
这是我到目前为止所提出的,但我不知道如何访问#map或#select存储的当前数组并且使用self无法正常工作
def duplicate_string_with_map(string)
string.downcase.chars.select { |char| string.index(char) != string.rindex(char) && self.include?(char) == false && char != ' ' }
end
答案 0 :(得分:1)
以下代码可以解决您的目的:
def duplicate_string_with_map(string)
(string.downcase.chars.select { |char| string.index(char) != string.rindex(char) && char != ' ' }).uniq
end
此处您无需检查include
条件,因为您已确保string.index(char) != string.rindex(char)
。
但是,为了更好的ruby方法,我建议你重新打开String
类并在那里写一个方法。
它看起来像这样:
class String
def duplicate_characters_array
(downcase.chars.select { |char| index(char) != rindex(char) && char != ' ' }).uniq
end
end
string = "I am a duplicate string"
string.duplicate_characters_array
答案 1 :(得分:1)
您不需要访问该阵列,也不需要使用Array#map
。
有很多方法可以达到目标。其中一个是将字符串拆分为chars然后对字符进行分组(获取哈希),拒绝空格字符组和小于两个元素的组并返回其余组的键:
"I am a duplicate string"
.downcase
.chars
.group_by{|i| i}
.reject{|k, v| k == ' ' || v.length < 2}
.keys
# ["a", "i", "t"]
答案 2 :(得分:0)
这里我们可以使用辅助方法Array#difference
。该方法解释为here。请注意,该链接包含指向SO答案的链接,其中我引用了其使用示例。虽然我提议将该方法添加到Ruby核心中,但似乎没有兴趣这样做。
class Array
def difference(other)
h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
reject { |e| h[e] > 0 && h[e] -= 1 }
end
end
我们可以按照以下方式使用此帮助程序。
def duplicate_string(str)
a = str.gsub(/\s/,'').downcase.reverse.chars
a.difference(a.uniq).uniq.reverse
end
duplicate_string "I am a duplicate string"
#=> ["a", "i", "t"]
步骤如下。
str = "I am a duplicate string"
b = str.gsub(/\s/,'')
#=> "Iamaduplicatestring"
c = b.downcase
#=> "iamaduplicatestring"
d = c.reverse
#=> "gnirtsetacilpudamai"
a = d.chars
#=> ["g", "n", "i", "r", "t", "s", "e", "t", "a", "c", "i", "l", "p",
# "u", "d", "a", "m", "a", "i"]
e = a.uniq
#=> ["g", "n", "i", "r", "t", "s", "e", "a", "c", "l", "p", "u", "d", "m"]
f = a.difference(e)
#=> ["t", "i", "a", "a", "i"]
g = f.uniq
#=> ["t", "i", "a"]
g.reverse
#=> ["a", "i", "t"]
关键步骤是计算f
。对于c
的每个元素e
,f
包含n-1
的{{1}}个实例,其中c
是n
的实例数在c
中。因此,该方法仅排除字符串中出现的空格以外的字符。