【问题标题】:How can I combine two arrays of arrays in a particular way in Ruby如何在Ruby中以特定方式组合两个数组数组
【发布时间】:2013-11-04 22:21:36
【问题描述】:

假设我有这两个数组:

a = [[1],[2],[3]]
b = [[4],[5],[6]]

是否有一个选项可以让我像这样组合它们:

a.combined_somehow(b) == [[1,4],[2,5],[3,6]]

因为我希望它防止我在内部数组中重复。我的意思是,如果是:

a = [[1],[2],[3]]
b = [[1],[5],[3]]

输出将是:[[1],[2,5],[3]]

【问题讨论】:

    标签: ruby arrays delegates combinations


    【解决方案1】:
    a = [[1],[2],[3]]
    b = [[4],[5],[6]]
    
    a.flatten.zip(b.flatten).map(&:uniq) # => [[1, 4], [2, 5], [3, 6]] 
    
    b = [[1],[5],[3]]
    a.flatten.zip(b.flatten).map(&:uniq) # => [[1], [2, 5], [3]] 
    

    【讨论】:

      【解决方案2】:
      require 'pp'
      
      a = [[1],[2],[3]]
      b = [[1],[5],[3]]
      
      def combine( a, b )
        [ a.flatten, b.flatten ].transpose.map(&:uniq)
      end
      
      pp combine( a, b )
      

      输出

      [[1], [2, 5], [3]]
      

      【讨论】:

      • 不需要 require.a.flatten.zip(b.flatten).uniq!工作得很好。
      • 对; pp(漂亮的打印)只是打印输出。使用“.uniq!”似乎对我不起作用.. 将 .uniq 放在最后会消除重复的矩阵,但不会消除您要求的内部元素。
      • 可以说这是对每个内部数组的迭代。因此它会从内部数组中删除重复项。
      • @user2128702 我们不要这么说,因为这不是正在发生的事情。马特是正确的。
      【解决方案3】:

      在我看来只是感觉有点像Rubyish:

      a = [[1],[2],[3]]
      b = [[4],[5],[6]]
      
      p a.zip(b).map(&:flatten) #=> [[1, 4], [2, 5], [3, 6]]
      
      a = [[1],[2],[3]]
      b = [[1],[5],[3]]
      
      p a.zip(b).map{|x|x.flatten.uniq} #=> [[1], [2, 5], [3]]
      

      【讨论】:

      • 6 对 0.5 打;其他人也是。
      • 当然,但是在 Ruby 中总是有很多方法可以做某事。我觉得这种方式比其他答案稍微有趣一些,因为: 1、它遵循 DRY 原则(flatten 使用一次),并且可以扩展到任意数量的数组。
      • 没错,虽然能够使用to_proc 很好。然而,总的来说,我倾向于同意你的观点,你关于它可以扩展到多个数组(通过添加单个字符!)的观点是锦上添花。
      【解决方案4】:

      我会如下:

      a = [[1],[2],[3]]
      b = [[4],[5],[6]]
      a.map.with_index{|e,i| e | b[i]}
      # => [[1, 4], [2, 5], [3, 6]]
      
      a = [[1],[2],[3]]
      b = [[4],[2],[6]]
      a.map.with_index{|e,i| e | b[i]}
      # => [[1, 4], [2], [3, 6]]
      

      【讨论】:

        猜你喜欢
        • 2020-09-22
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        • 2012-08-14
        • 2010-12-05
        • 1970-01-01
        • 2021-02-27
        • 1970-01-01
        相关资源
        最近更新 更多