我有一個數組:你如何替換數組中的重複元素?
[1, 4, 4, 4, 2, 9, 0, 4, 3, 3, 3, 3, 4]
,並希望用字符串"repeat"
取代的重複值。指數1
,2
,3
和3
處的索引8
,9
,10
,11
的重複4
應該被替換。我應該得到:
[1, "repeat", 2, 9, 0, 4, "repeat", 4]
這是如何完成的?
我有一個數組:你如何替換數組中的重複元素?
[1, 4, 4, 4, 2, 9, 0, 4, 3, 3, 3, 3, 4]
,並希望用字符串"repeat"
取代的重複值。指數1
,2
,3
和3
處的索引8
,9
,10
,11
的重複4
應該被替換。我應該得到:
[1, "repeat", 2, 9, 0, 4, "repeat", 4]
這是如何完成的?
以下兩種方法可以做到這一點。
#1使用Enumerable#chunk:
arr = [1,4,4,4,2,9,0,4,3,3,3,3,4]
arr.chunk(&:itself).map { |f,a| a.size==1 ? f : "repeat" }
#=> [1, "repeat", 2, 9, 0, 4, "repeat", 4]
的步驟:
enum.to_a
#=> [[1, [1]], [4, [4, 4, 4]], [2, [2]], [9, [9]], [0, [0]],
# [4, [4]], [3, [3, 3, 3, 3]], [4, [4]]]
:
enum = arr.chunk(&:itself)
#=> #<Enumerator: #<Enumerator::Generator:0x007febc99fb160>:each>
我們可以通過將其轉換爲一個數組查看此枚舉的元件Object#itself w如Ruby v2.2中所添加的那樣。對於較早的版本,你會用
enum = arr.chunk { |e| e }
它現在是一個簡單的事情的enum
元素映射爲要求:
enum.map { |f,a| a.size==1 ? f : "repeat" }
#=> [1, "repeat", 2, 9, 0, 4, "repeat", 4]
arr.slice_when { |e,f| e !=f }.map { |a| a.size==1 ? a.first : "repeat" }
步驟:
enum = arr.slice_when { |e,f| e !=f }
#=> #<Enumerator: #<Enumerator::Generator:0x007febc99b8cc0>:each>
a = enum.to_a
#=> [[1], [4, 4, 4], [2], [9], [0], [4], [3, 3, 3, 3], [4]]
a.map { |a| a.size==1 ? a.first : "repeat" }
#=> [1, "repeat", 2, 9, 0, 4, "repeat", 4]
slice_when
在Ruby v.2.2中引入。
值得注意的是,「Object#本身」在Ruby 2.2中是新的。在早期版本中,您需要使用'chunk {| o | o}'。 –
謝謝,@Jordan。我補充說。 –
這是優秀的天才!感謝卡里和喬丹! –
歡迎來到SO。請閱讀「[問]」和http://tinyurl.com/stack-hints。你有什麼嘗試?爲什麼它不工作?如果你沒有嘗試,爲什麼不呢? –