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

基于传入值对数组重新排序

  •  -2
  • Bitwise  · 技术社区  · 7 年前

    如果我有这个数组:

    ["A", "B", "C", "D"]
    

    我有这个字符串:

    "C"
    

    我想重新排列数组,使其看起来像这样:

    ["C", "A", "B", "D"]
    

    因此,传入的字符串将匹配的元素移到列表的前面。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Cary Swoveland    7 年前
    a = ['A', 'B', 'C', 'D', 'C']
    target = 'C'
    
    a.partition { |e| e==target }.reduce(:+)
      #=> ["C", "C", "A", "B", "D"]
    

    a.select { |e| e==target }.concat(a.reject { |e| e==target })
      #=> ["C", "C", "A", "B", "D"]
    

    a

        2
  •  1
  •   Stefan    7 年前

    如果你真的想

    a = ['A', 'B', 'C', 'D']
    a.sort_by.with_index { |e, i| [e == 'C' ? 0 : 1, i] }
    #=> ["C", "A", "B", "D"]
    

    否则,你可以 delete 'C' prepend 信息技术:

    a.prepend(a.delete('C'))
    #=> ["C", "A", "B", "D"]
    

    请注意,这将修改 a

        3
  •  1
  •   iGian    7 年前

    如果您有非uniq目标字符串:

    ary = ["A", "B", "C", "D", "C"]
    target = "C"
    
    ary.count(target).times.map{ target } + ary.reject{ |e| e == target }
    #=> ["C", "C", "A", "B", "D"]
    

    我必须找到一个更优雅的方式。。。

    ary.find_all{ |e| e == target } + ary.tap { |a| a.delete target }
    
    推荐文章