Ruby on rails 如何从Ruby中的另一个数组创建重复的不区分大小写的字符串数组?

Ruby on rails 如何从Ruby中的另一个数组创建重复的不区分大小写的字符串数组?,ruby-on-rails,ruby,arrays,string,duplicates,Ruby On Rails,Ruby,Arrays,String,Duplicates,我有一个字符串数组。我想更改这些重复字符串的名称,以附加一个数值,使它们像这样唯一 原始阵列 a, a, A, b, c, D, d a, a1, A2, b, c, D, d1 校正阵列 a, a, A, b, c, D, d a, a1, A2, b, c, D, d1 我已经用下面的代码接近了这一点;但是,如果字符串是不同的大小写结构,则当前不认为它们与此代码段重复。我希望它们被认为是重复的,但不改变它们在结果数组中的大小写 duplicate_counter = 1 duplic

我有一个字符串数组。我想更改这些重复字符串的名称,以附加一个数值,使它们像这样唯一

原始阵列

a, a, A, b, c, D, d
a, a1, A2, b, c, D, d1
校正阵列

a, a, A, b, c, D, d
a, a1, A2, b, c, D, d1
我已经用下面的代码接近了这一点;但是,如果字符串是不同的大小写结构,则当前不认为它们与此代码段重复。我希望它们被认为是重复的,但不改变它们在结果数组中的大小写

duplicate_counter = 1
duplicates = Array.new
duplicates = file_columns.select{ |e| file_columns.count(e) > 1 } # get duplicate column names

duplicates.each{ |x| file_columns.delete(x) }
duplicates.sort!
duplicates.each_with_index do |d, i|

  if i > 0
     if d == duplicates[i-1]
        d = d.strip + duplicate_count.to_s
        duplicate_count += 1
     else 
        duplicate_count = 1
     end
  end

  # Add back the column names, but with the appended numerical counts to make them unique
  file_columns.push(d)
end

你想得太多了。我相信也有更好的方法可以做到这一点,但它完成了任务

a = ['a', 'a', 'A', 'b', 'c', 'D', 'd']
letters = Hash.new(-1)
a.map do |letter|
  l = letter.downcase
  letters[l] += 1
  if (letters[l] > 0)
    "#{letter}#{letters[l]}"
  else
    "#{letter}"
  end
end

如果独立于大小写的字母不一定分组,那么这里有一种方法。例如,它将转换此数组:

arr = %w{ a D a A b c D a d }
  #=> ["a", "D", "a", "A", "b", "c", "D", "a", "d"]
致:

代码

def convert(arr)
  arr.each_with_index
     .group_by { |c,_| c.downcase }
     .values
     .flat_map { |c|
       c.map
        .with_index { |(f,l),i| [i > 0 ? f<<i.to_s : f, l] } }
     .sort_by(&:last)
     .map(&:first)
end
解释

亲爱的读者,如果您是Ruby新手,这看起来可能非常复杂。不过,如果你把它分解成几个步骤,就没那么糟糕了。在你获得经验并熟悉常用的方法之后,它会自然而然地出现。在这里,我使用了以下方法,将它们链接在一起,以便每个方法的返回值成为下一个方法的接收者:

下面是正在发生的事情

enum = arr.each_with_index
  #=> #<Enumerator: ["a", "D", "a", "A", "b", "c",
  #                  "D", "a", "d"]:each_with_index>
h = enum.group_by { |c,_| c.downcase }
  #=> {"a"=>[["a", 0], ["a", 2], ["A", 3], ["a", 7]],
  #    "d"=>[["D", 1], ["D", 6], ["d", 8]],
  #    "b"=>[["b", 4]],
  #    "c"=>[["c", 5]]}
a = h.values
  #=> [[["a", 0], ["a", 2], ["A", 3], ["a", 7]],
  #    [["D", 1], ["D", 6], ["d", 8]],
  #    [["b", 4]],
  #    [["c", 5]]]
b = a.flat_map { |c| c.map.with_index { |(f,l),i| [i > 0 ? f<<i.to_s : f, l] } }
  #=> [["a", 0], ["a1", 2], ["A2", 3], ["a3", 7], ["D", 1],
  #    ["D1", 6], ["d2", 8], ["b", 4], ["c", 5]]
c = b.sort_by(&:last)
  #=> [["a", 0], ["D", 1], ["a1", 2], ["A2", 3], ["b", 4],
  #    ["c", 5], ["D1", 6], ["a3", 7], ["d2", 8]]
c.map(&:first)
  #=> ["a", "D", "a1", "A2", "b", "c", "D1", "a3", "d2"]
enum=arr.each_与_索引
#=> #
h=enum.group_by{c,{c.downcase}
#=>{“a”=>[[“a”,0],“a”,2],“a”,3],“a”,7],
#“d”=>[[“d”,1],“d”,6],“d”,8],
#“b”=>[[“b”,4]],
#“c”=>[[“c”,5]]}
a=h值
#=>[[“a”,0],“a”,2],“a”,3],“a”,7],
#[“D”,1],“D”,6],“D”,8],
#[“b”,4],
#[“c”,5]]
b=a.flat_-map{c|c.map.with_-index{(f,l),i |[i>0?f[“a”,0],“D”,1],“a1”,2],“A2”,3],“b”,4],
#[“c”,5],“D1”,6],“a3”,7],“d2”,8]]
c、 地图(&:第一)
#=>[“a”、“D”、“a1”、“A2”、“b”、“c”、“D1”、“a3”、“d2”]

sweet工作得很好!是的,仔细考虑过了!谢谢