您可以将 .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
中的最后一个索引排序。
我们可以使用 uniq
、sort_by
和 rindex
(这将 return 给定元素的最后一个索引)
来处理这个问题
arr = [3,4,4,3,6,3]
arr.uniq.sort_by(&arr.method(:rindex))
#=> [4,6,3]
我对这个问题的理解是,如果 arr
是一个给定的数组,我们将生成一个数组 brr
,其中包含 arr
的唯一元素,该元素具有以下 属性:对于任意两个索引 i
和 j
、0 <= i < j <= brr.size-1
、arr.rindex(brr[i]) < arr.rindex(brr[j]
。上面写着,“arr
中 brr[i]
的最后一个实例先于 arr
中 brr[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?。集合查找与哈希键查找一样,非常快,几乎与集合的大小无关。
在使用 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
中的最后一个索引排序。
我们可以使用 uniq
、sort_by
和 rindex
(这将 return 给定元素的最后一个索引)
arr = [3,4,4,3,6,3]
arr.uniq.sort_by(&arr.method(:rindex))
#=> [4,6,3]
我对这个问题的理解是,如果 arr
是一个给定的数组,我们将生成一个数组 brr
,其中包含 arr
的唯一元素,该元素具有以下 属性:对于任意两个索引 i
和 j
、0 <= i < j <= brr.size-1
、arr.rindex(brr[i]) < arr.rindex(brr[j]
。上面写着,“arr
中 brr[i]
的最后一个实例先于 arr
中 brr[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?。集合查找与哈希键查找一样,非常快,几乎与集合的大小无关。