我有一个字符串"teststring"
。我想在Ruby中找到第一个非重复出现的角色。
我有这个Python代码:
def first_non_repeat_character(teststring)
unique=[]
repeated=[]
for character in teststring:
if character in unique:
unique.remove(character)
repeated.append(character)
else:
if not character in repeated:
unique.append(character)
if len(unique):
return unique[0]
else:
return false
答案 0 :(得分:4)
def first_non_repeat_character(string)
string.chars.find { |character| string.count(character) == 1 }
end
first_non_repeat_character('teststring') # => "e"
答案 1 :(得分:1)
应该这样做:
def first_non_repeat_character(teststring)
group = teststring.chars.group_by {|i| i}.find {|letter, group| group.one? }
group && group.first
end
从ruby 2.2.1开始,您可以使用group_by(&:itself)
答案 2 :(得分:1)
对@BroiSatse的基本想法表示赞同,如果你使用新的Object#itself方法使用Ruby 2.2+,我建议他在irb或pry控制台中链接的答案有以下变化:
'teststring'.chars.group_by(&:itself).values.select { |v| v.one? }.flatten.first
#=> "e"
这种方法的好处(与定义方法相反)是很容易回溯方法链进行调试。如果你没有得到你期望的答案,只需继续删除方法链的尾部,直到找到问题为止。
答案 3 :(得分:1)
另一个:
'teststring'.each_char.with_object(Hash.new(0)) { |c, h| h[c] += 1 }.key(1)
#=> "e"
each_char
遍历每个角色:
'teststring'.each_char.to_a
#=> ["t", "e", "s", "t", "s", "t", "r", "i", "n", "g"]
with_object
将Hash
的默认值0
传递给块,以便计算每个字符(返回哈希值):
'teststring'.each_char.with_object(Hash.new(0)) { |c, h| h[c] += 1 }
#=> {"t"=>3, "e"=>1, "s"=>2, "r"=>1, "i"=>1, "n"=>1, "g"=>1}
key
返回给定值的键(即字符)(即计数为1)
'teststring'.each_char.with_object(Hash.new(0)) { |c, h| h[c] += 1 }.key(1)
#=> "e"
可能需要注意的是:虽然实现返回给定值的第一个键,但文档说:
返回给定值的出现次数的键。
答案 4 :(得分:1)
你可以写:
Array#difference
我的回答here中定义了Array#difference
。
Array#-
与a = [1,2,3,4,3,2,2,4]
b = [2,3,4,4,4]
a - b #=> [1]
a.difference b #=> [1, 3, 2, 2]
类似。以下示例说明了不同之处:
arr.difference(arr.uniq)
因此, e
会返回arr
arr.count(e) > 1
的所有元素arr.difference(arr.uniq)
的数组。
arr - arr.difference(arr.uniq)
会返回重复的字符,所以
arr
返回非重复出现的字符,按照"http://www.stackoverflow.com?v=" + BuildConfig.VERSION_NAME
中的顺序排序。
答案 5 :(得分:0)
这是一个考虑是否有大写字母的示例。例如,如果你传入
"sTresst" => "r"
def first_non_repeating_letter(s)
s.each_char do |char|
return char if s.downcase.count(char.downcase) < 2
end
""
end