我有一个数组,它可能包含也可能不包含重复,但没有nil或“”值。
array = ["Ballerina", "Lagoon", "Black", "Space", "Golden", "Lagoon"]
这真的是我最接近解决这个问题的方法,但问题是我不知道重复的内容,所以它不是真的有效:
array.each_with_index.map {|value, index| array[index] == "Lagoon" ? index : ""}.uniq
我希望返回的是数组中的任何重复项都将索引值连接到数组值的末尾。所以最终的结果是:
array = ["Ballerina", "Lagoon 1", "Black", "Space", "Golden", "Lagoon 5"]
谢谢
4条答案
按热度按时间7rtdyuoh1#
一种方法是使用Enumerable#tally方法按值存储总计数的散列。
n9vozmp42#
输入
编码
输出
pdsfdshx3#
我会做:
ckx4rj1h4#
这个答案适用于数组很大而重复数相对较少的情况,因为所建议的计算只需要通过数组一次。
请注意,我并不认为它一定比第一步使用Enumerable#tally方法的方法更快,只是它只需要一次遍历数组。
假设数组如下。
我们首先构造一个数组
indices
,它由arr
的索引组成,对于indices
的每个元素i
,arr[i]
将以所需的方式进行修改。然后,我们根据需要通过迭代
indices
修改arr
的副本。通过检查Kernel#dup的源代码,人们发现-毫不奇怪-该方法(用C实现)复制了一个内存块,因此不构成
arr
元素的第二个枚举。计算
indices
的步骤如下。