我正在努力尝试从阵列中删除一些重复项。我有一个规格,要求我不要使用内置的排序和放大器重复数据删除方法......
所以.uniq
.sort
等已停止使用......
这是我的阵列......
array = [1, "fred", 6, 5, "fred", "john", 6, "peter", "fred"]
我需要输出...
sorted_array = [1, 6, 5, "fred", "john", "peter"]
到目前为止,我尝试使用Set
以及array & array
,但输出顺序错误。我需要在字符串之前的列表中出现整数...
我也试过迭代,找出一个元素是否多次出现并使用.delete& .delete_at然而我无法弄清楚如何删除第二个/第三个/第四个出现的元素...
答案 0 :(得分:0)
创建并返回二级清理数组使这一点变得非常简单:迭代原始数组并仅附加已清理数组中尚不存在的那些元素:
def clean(array)
cleaned = []
array.each do |element|
cleaned << element if not cleaned.include?(element)
end
return cleaned
end
这相对较快,完全符合您的要求。
概念证明(irb):
2.2.2 :001 > def clean(array); cleaned=[]; array.each{|ele| cleaned << ele if not cleaned.include? ele}; cleaned; end
=> :clean
2.2.2 :002 > clean [1, "fred", 6, 5, "fred", "john", 6, "peter", "fred"]
=> [1, "fred", 6, 5, "john", "peter"]
您可以使用Hash
来改善大型阵列的处理时间。这可以通过附加元素作为键来改善内部查找时间,然后简单地返回其数组的键列表。 (警告:这样做可能会以任意顺序返回它们,因此可能需要进一步努力才能保持原始顺序。)
修改:我错过了预期输出中的排序要求。道歉。
答案 1 :(得分:0)
以@terra所做的为基础:
def uniq(array)
uniq = []
array.each do |element|
uniq << element unless uniq.include?(element)
end
uniq
end
def sort(array)
sorted = []
[Integer, String].each do |type|
sorted += array.select { |element| element.is_a? type }
end
sorted
end
现在如果你这样做了:
p uniq_and_sorted = sort(uniq([1, "fred", 6, 5, "fred", "john", 6, "peter", "fred"]))
你应该得到:
[1, 6, 5, "fred", "john", "peter"]
答案 2 :(得分:0)
这可能很长,但它确实有效:
array = [1, "fred", 6, 5, "fred", "john", 6, "peter", "fred"]
numbers_array = []
array.each do |e|
numbers_array << e if e == e.to_i
end
numbers_array.sort!
strings_array = []
array.each do |e|
strings_array << e if e == e.to_s
end
strings_array.sort!
final_array = []
final_array << numbers_array << strings_array
final_array.flatten!
final_array.uniq!
p final_array
答案 3 :(得分:0)
我不知道哪些内置方法无法使用,但如果你可以使用Array#|,很难想象比
更简单的东西array | []
#=> [1, "fred", 6, 5, "john", "peter"]
请注意,这会保留array
。
array & array
也适用。