使用map / select时如何访问当前数组

时间:2017-09-10 05:42:10

标签: ruby

我有以下(工作)代码我正在尝试使用#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

3 个答案:

答案 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的每个元素ef包含n-1的{​​{1}}个实例,其中cn的实例数在c中。因此,该方法仅排除字符串中出现的空格以外的字符。