【问题标题】:removing duplicates from a ruby array without using built in methods... eg. .uniq, .sort etc在不使用内置方法的情况下从 ruby​​ 数组中删除重复项......例如。 .uniq、.sort 等
【发布时间】:2016-05-25 23:07:18
【问题描述】:

我正在努力尝试从数组中删除一些重复项。我有一个规范,要求我不使用内置的排序和重复数据删除方法...... 所以.uniq.sort等已经没用了……

这是我的数组...

array = [1, "fred", 6, 5, "fred", "john", 6, "peter", "fred"]

我需要它来输出...

sorted_array = [1, 6, 5, "fred", "john", "peter"]

到目前为止,我尝试使用Setarray & array,但是输出顺序错误。我需要整数出现在字符串之前的列表中...

我也尝试过迭代,查找一个元素是否多次出现并使用 .delete 和 .delete_at 但是我不知道如何删除第二个/第三个/第四个出现的元素...

【问题讨论】:

    标签: arrays ruby sorting duplicates


    【解决方案1】:

    我不知道你不能使用哪些内置方法,但如果你可以使用Array#|,很难想象有什么比它更简单的了

    array | []
      #=> [1, "fred", 6, 5, "john", "peter"]
    

    请注意,这保留了array 的顺序。

    array & array 也可以。

    【讨论】:

      【解决方案2】:

      创建并返回一个二级清理后的数组使这变得相当简单:迭代原始数组并仅附加清理后的数组中尚不存在的元素:

      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 来缩短大型数组的处理时间。这可以通过将元素附加为键来改善内部查找时间,然后简单地为您的数组返回其键的列表。 (注意:这样做可能会以任意顺序返回它们,因此可能需要进一步努力来维持原始顺序。)

      编辑:我错过了您预期输出中的排序要求。道歉。

      【讨论】:

      • 别担心! :) 我曾经有过同样的方法!总是让我抓狂的排序! :)
      【解决方案3】:

      以@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"]
      

      【讨论】:

        【解决方案4】:

        这可能有点啰嗦,但确实有效:

            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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-22
          • 1970-01-01
          • 2021-08-29
          • 1970-01-01
          • 2013-07-31
          • 1970-01-01
          相关资源
          最近更新 更多