不使用`uniq`返回数组的唯一值

时间:2016-02-08 13:44:56

标签: arrays ruby

对于挑战,我试图在不使用uniq的情况下返回数组的唯一值。这就是我到目前为止所做的工作:

def unique
   unique_arr = []
   input_arr.each do |word|
     if word != unique_arr.last
       unique_arr.push word
     end
   end
   puts unique_arr
end
input = gets.chomp
input_arr = input.split.sort
input_arr.unique

我的理由是,如果我在使用each迭代数组之前先对数组进行排序,我可以push将其更改为unique_arr而无需重复考虑它是否可以考虑#39} ; sa重复,推送的最后一个值将匹配它。

我是以错误的方式解决这个问题吗?

6 个答案:

答案 0 :(得分:4)

是的,你至少犯了两个错误。

  1. 如果您想将// Get documents var news = DocumentHelper.GetDocuments("CMS.News") .OnSite("CorporateSite") .Path("/News", PathTypeEnum.Children) .Culture("en-us") .CombineWithDefaultCulture(false); 称为input_arr.unique作为数组,则必须在input_arr上定义方法。您的方法体中有Array,它来自任何地方。
  2. 代码的最后一行中的
  3. input_arr输出到终端,但使方法返回puts,这使其行为与nil不同。
  4. 可以修改为:

    uniq

答案 1 :(得分:3)

这是一个简洁的方法,它没有明确地使用另一个类的功能,但可能会错过挑战的重点:

class Array
  def unique
    group_by(&:itself).keys
  end
end

答案 2 :(得分:3)

一个独特的阵列?这对我来说听起来像Set

require 'set'

Set.new([1,2,3,2,3,4]).to_a
#=> [1,2,3,4]

答案 3 :(得分:0)

我尝试了这三个选项。只是为了挑战

class Array
  def unique
    self.each_with_object({}) { |k, h| h[k] = k }.keys
  end

  def unique2
    self.each_with_object([]) { |k, a| a << k unless a.include?(k) }
  end

  def unique3
    arr = []
    self.map { |k| arr << k unless arr.include?(k) }
    arr
  end
end

答案 4 :(得分:0)

以下是另一种方法:

uniques = a.each.with_object([]) {|el, arr| arr << el if not arr.include?(el)}

答案 5 :(得分:-1)

如果你这样看,那就太容易了:

a = [1,1,2,3,4]
h = Hash.new
a.each{|q| h[q] = q}
h.values

这将返回:

[1, 2, 3, 4]