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工作得很好!是的,仔细考虑过了!谢谢