【问题标题】:Reorder array based on passed in value根据传入的值重新排序数组
【发布时间】:2018-11-10 05:34:41
【问题描述】:

如果我有这个数组:

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

我有这个字符串:

"C"

我想将数组重新排序为如下所示:

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

所以,传入的字符串会将匹配的元素移动到列表的前面。

【问题讨论】:

  • 输入数组总是排序的吗?如果有多个匹配元素怎么办?所有元素都是独一无二的吗?谢谢。
  • 好问题,对于这种特殊情况,不可能。是的,所有元素都是独一无二的。
  • 当数组为["A", "B", "C", "D", "C"],字符串为"C"时,你想要的结果是什么?另外:不要忘记在您的 cmets 中包含 @username,以便 SO 通知预期的收件人。

标签: ruby


【解决方案1】:
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 未被修改。

【讨论】:

  • 这就是我想要的! a.partition { |e| e==target }.reduce(:+)
【解决方案2】:

如果你真的想对数组进行排序,这会起作用:

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】:

    如果你有非唯一的目标字符串:

    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 }
    

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 1970-01-01
      • 2021-11-05
      • 2017-12-27
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多