Переупорядочить массив на основе переданного значения - PullRequest
0 голосов
/ 09 ноября 2018

Если у меня есть этот массив:

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

У меня есть эта строка:

"C"

Я хочу изменить порядок массива, чтобы он выглядел так:

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

Таким образом, переданная строка переместит соответствующий элемент в начало списка.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

В случае, если у вас не целевая строка, отличная от 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 }
0 голосов
/ 10 ноября 2018
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 не изменяется.

0 голосов
/ 09 ноября 2018

Если вы действительно хотите отсортировать массив, это будет работать:

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

В противном случае вы можете просто delete 'C' из массива и prepend it:

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

Обратите внимание, что это изменит a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...