如何在Ruby中找到字符串的第一个非重复字母?

时间:2015-09-30 10:49:07

标签: ruby string

我有一个字符串"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

6 个答案:

答案 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_objectHash的默认值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