-1

初学者需要帮助(培训目的)。例如,我有方法 custom_uniq 并希望它像标准 .uniq ([1, 2, 1, 3, 3].uniq >> [1,2,3]) 一样工作

def custom_uniq(arr)
new_arr = []
  arr.each do |elem|
    new_arr << elem if new_arr.include?(elem) == false
  end
new_arr
end

那么,我应该修改哪些特定部分以将工作方法直接插入到类中?

class Array
  def custom_uniq
   ?????????
   ????????
  end
end
arr = [1,2,3,1,3,4,5,77]
arr.custom_uniq >> [1,2,3,4,5,77]
4

2 回答 2

3

这是一个完美的用例Array#Reject和所见项目的记忆:

class Array
  def custom_uniq
    seen = Hash.new
    reject do |item|
      item_is_duplicate = seen[item] # Check if item has occured already
      seen[item] = true unless item_is_duplicate # Remember seeing new item
      item_is_duplicate # Reject the item from returned array if duplicate
    end
  end
end

编辑:关于运行时间的其他统计信息...

我制作了下面的图来演示使用这种基于哈希的方法与每次迭代检查输出数组之间的区别:

gnuplot

用于生成此图的代码(包括定义片段在内的 43 行)在此处

于 2013-07-31T12:22:34.347 回答
2
class Array
  def custom_uniq
    new_array = []
    each do |elem| # you call each method on self here
      new_array << elem unless new_array.include?(elem)
    end
    new_array
  end
end

或者,正如@toro2k 所建议的,您可以使用Enumerable#each_with_object方法:

class Array
  def custom_uniq
    each_with_object([]) do |elem, new_array|
      new_array << elem unless new_array.include? elem
    end
  end
end
于 2013-07-31T11:41:48.723 回答