不使用内置方法从ruby数组中删除重复项...例如。 .uniq,.sort等

时间:2016-05-25 23:07:19

标签: arrays ruby sorting duplicates

我正在努力尝试从阵列中删除一些重复项。我有一个规格,要求我不要使用内置的排序和放大器重复数据删除方法...... 所以.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然而我无法弄清楚如何删除第二个/第三个/第四个出现的元素...

4 个答案:

答案 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也适用。