根据传入的值对数组重新排序

时间:2018-11-09 16:41:36

标签: ruby

如果我有这个数组:

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

我有这个字符串:

"C"

我想对数组重新排序,如下所示:

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

因此,传入的字符串会将匹配的元素移到列表的开头。

3 个答案:

答案 0 :(得分:3)

Dim myDir As DirectoryInfo = New DirectoryInfo("c:\temp\")
        If (myDir.EnumerateFiles().Any()) Then


 foreach ....


else

MessageBox.Show("no files in directory ")   <-- my message

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"] 未修改。

答案 1 :(得分:1)

如果您实际上想对数组进行排序,那么它将起作用:

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

答案 2 :(得分:1)

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

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 }