代码之家  ›  专栏  ›  技术社区  ›  dawg

Ruby用可变条件划分数组

  •  0
  • dawg  · 技术社区  · 4 年前

    假设我有一个这样的数组:

    arr=[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"], 
         ["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"], ["1"], ["2"], 
         ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]
    

    即长度为1的一系列子列表(1个或多个)后接一系列长度大于1的子列表(一个或多个子列表)。

    我想把这份清单分为:

    [[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"]], 
     [["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"]], 
     [["1"], ["2"], ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]]
    

    即长度为1的子列表与长度大于1的以下子列表组合为这些子列表的单个子列表。

    这样可以:

    data = []
    
    while arr.length > 0  
        tmp = []
    
        while arr.length > 0 && arr[0].length() == 1
            tmp << arr.shift 
        end
    
        while arr.length > 0 && arr[0].length() > 1
            tmp << arr.shift 
        end
    
        data << tmp 
    end
    
    p data
    # [[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"]], [["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"]], [["1"], ["2"], ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]]
    

    但这似乎非常笨拙。有没有 .groupby 或者我缺少的触发器或某种形式的Ruby枚举器,以便更容易地做到这一点?

    2 回复  |  直到 4 年前
        1
  •  3
  •   Chris    4 年前

    作为对@dawg答案的改进,如果我们通过的块 :slice_when 检查 b 大于 a :

    data = arr.slice_when { |a, b| b.length < a.length }.to_a
    

    结果是:

    [[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"]], 
     [["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"]], 
     [["1"], ["2"], ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]]
    

    这只能正确处理数组有长度的情况 1 2 。为了使其更加稳健,我们可以检查我们只在 b 具有长度 1.

    data = arr.slice_when { |a, b| b.length == 1 && b.length < a.length }.to_a
    

    现在,如果:

    arr = [["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"], ["1", "3", "4"], ["1", "1"], 
           ["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"], ["1"], ["2"], 
           ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]
    

    结果是:

    [[["1"], ["1"], ["2", "2"], ["2.1", "0.8"], ["2.2", "0.2"], ["1", "3", "4"], ["1", "1"]], 
     [["1"], ["2", "3"], ["2", "0.8"], ["2", "0.4"]], 
     [["1"], ["2"], ["1", "0.8"], ["2", "0.4"], ["3", "0.3"]]]
    
    推荐文章