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

3

我有一个字符串数组。我想将这些重复的字符串更改名称,以附加数字值使它们唯一,如下所示...

原始数组

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
2个回答

3

您在过度思考了。我相信还有更好的方法来解决这个问题,但它能够完成任务。

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

甜美完美地运作!是的,不要想太多!谢谢。 - daveomcd

1

如果不需要按大小写分组,这是一种实现的方法。例如,它将转换以下数组:

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

to:

["a", "D", "a1", "A2", "b", "c", "D1", "a3", "d2"]

代码

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

例子

对于上面的arr:

convert(arr)
 #=> ["a", "D", "a1", "A2", "b", "c", "D1", "a3", "d2"]

说明

亲爱的读者,如果你是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"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接