您可以将 .uniq 与什么结合起来以保持数组的原始顺序?

What could you combine .uniq with to keep the original order of an array?

在使用 Ruby .uniq 方法甚至 .to_set?

时,您将如何改变数组的顺序或保持数组的自然顺序

例如:

([3,4,4,3,6,3]) # =>  [4,6,3])

### with current method my solution outputs:
 
Expected: [4, 6, 3], instead got: [3, 4, 6]

这些是我迄今为止尝试过的所有其他方法:

def solve arr 

#arr.each do |charas| arr << charas unless arr.include?(charas)
#end 
  arr.to_set.to_a
  # arr.uniq
  # arr & arr
  # arr.to_set
  
end

示例测试:

(solve([3,4,4,3,6,3]),[4,6,3])
    Test.assert_equals(solve([1,2,1,2,1,2,3]),[1,2,3])
    Test.assert_equals(solve([1,2,3,4]),[1,2,3,4])
    Test.assert_equals(solve([1,1,4,5,1,2,1]),[4,5,2,1])

您期望什么顺序?你想要他们最后一个索引排列的数字吗?

def solve arr 

#arr.each do |charas| arr << charas unless arr.include?(charas)
#end 
  arr.each_with_object([]) do |element,arr|
    if arr.include?(element)
      arr.delete(element)
      arr<<element
    else
      arr<<element
    end
  end
end
p solve([3,4,4,3,6,3]) # =>  [4,6,3])

我不确定您希望如何获得您显示的订单。您的问题中可能没有包含代码。无论如何,在 Ruby 2.7.1 Array#uniq 上肯定会保留原始顺序:

[3,4,4,3,6,3].uniq
#=> [3, 4, 6]

如果您想做一些不同的事情,一个合乎逻辑的方法可能是使用 Enumerable#each_with_index 遍历数组,使用索引以您认为合适的任何方式管理元素的顺序。

使用reverse twice: before and after uniq。这:reverse.uniq returns 原始 数组 中从最后到第一次出现的顺序排列的唯一元素。第二个 reverse 将这些元素按照在输入数组中找到的顺序放置:

my_array.reverse.uniq.reverse

例如:

puts [3,4,4,3,6,3].reverse.uniq.reverse.inspect     # => [4, 6, 3]
puts [1,2,1,2,1,2,3].reverse.uniq.reverse.inspect   # => [1, 2, 3]
puts [1,2,3,4].reverse.uniq.reverse.inspect         # => [1, 2, 3, 4]
puts [1,1,4,5,1,2,1].reverse.uniq.reverse.inspect   # => [4, 5, 2, 1]

您似乎希望唯一元素按其在 Array 中的最后一个索引排序。

我们可以使用 uniqsort_byrindex(这将 return 给定元素的最后一个索引)

来处理这个问题
arr = [3,4,4,3,6,3]
arr.uniq.sort_by(&arr.method(:rindex))
#=> [4,6,3]

我对这个问题的理解是,如果 arr 是一个给定的数组,我们将生成一个数组 brr,其中包含 arr 的唯一元素,该元素具有以下 属性:对于任意两个索引 ij0 <= i < j <= brr.size-1arr.rindex(brr[i]) < arr.rindex(brr[j]。上面写着,“arrbrr[i] 的最后一个实例先于 arrbrr[j] 的最后一个实例。

这是一种在 一次通过 中生成所需数组的方法。

require 'set'
def weird_uniq(arr)
  set = Set.new
  h = arr.reverse_each.with_object([]) { |n,a| a.unshift(n) if set.add?(n) }
end
weird_uniq [3,4,4,3,6,3]
  #=> [4,6,3])
weird_uniq [1,2,1,2,1,2,3]
  #=> [1,2,3]
weird_uniq [1,2,3,4]
  #=> [1,2,3,4]
weird_uniq [1,1,4,5,1,2,1]
  #=> [4, 5, 2, 1] 

参见 Set#add?。集合查找与哈希键查找一样,非常快,几乎与集合的大小无关。