2015-07-10 93 views
0

所以我相信我理解這段代碼。在codewars中提示我在提供的數組中返回重複項。這是我經過一番搜索後想出來的。我很新的Ruby和想深入瞭解這段代碼,而不是僅僅用它來傳遞代碼的挑戰。解釋這對我說:arr.detect {| E | arr.rindex(E)!= arr.index(E)}

糾正我,如果我錯了,或添加任何東西,我失蹤...

  • ARR是數組。
  • .detect是一種通過枚舉傳遞enum中的每個條目的方法。然後它返回該塊不是假的第一個。
  • 在這種情況下,使其通過:

    {|e| arr.rindex(e) != arr.index(e)} 
    
  • 在該塊的處理是Ë表示在枚舉每個條目。

  • .rindex(e)從最後搜索到第一Ë陣列中並返回參數()中描述的匹配陣列對象代碼的部分。
  • 的.index(e)中返回第一個對象,它是真正在數組中。

因此,包裝這一切了,「.rindex」檢查從陣列的第一個真正的對象月底開始,而的.index不相同,但是從陣列開始,直到他們打.rindex.index錯誤的編號。由於塊本身是真的(arr.rindex(e)是不等於arr.index(E)),檢測該返回是重複的對象。

arr.detect {|e| arr.rindex(e) != arr.index(e) } 

這一切對我來說仍然是非常高的水平,對於我來說,這對某些人來說會更好一點。提前致謝!

回答

2

非常接近,但是#index#rindex返回數組索引(位置),在該索引處找到與e匹配的元素,分別從左側和右側開始。你知道你已經找到了一個重複的當值從指數和RINDEX不匹配返回。例如,給出:

arr = [:a, :b, :b, :c] 
arr.index(:b) # => 1 
arr.rindex(:b) # => 2 

每個條目的數組索引是0, 1, 2, 3。這裏,從左邊搜索:b首先在位置2(索引1)找到,但是從右邊搜索,首先在位置3(索引2)找到。由於索引不匹配,所以您知道已經找到兩個具有相同值的元素,但數組中的位置不同,因此您有重複的元素。

(作爲一個有趣的拋開,這項技術是one of my better-voted SO answers。)

+0

是的,你完全擊敗了我:) –

+0

大聲笑。謝謝克里斯,他的答案和解釋。目前總noob,立志不成。 –

1

不久:

  • 指數(e)是含陣列ë
  • RINDEX(e)中的第一時隙的索引包含E
  • 陣列的最後一個時隙的索引

如果索引(e)與rindex(e)不同,則至少有兩個包含e的槽。