Заказать массив в чередующемся порядке - PullRequest
1 голос
/ 20 апреля 2019

У меня есть массив хэшей:

[ 
  {item0: 1.0, item1: 0.0},
  {item0: 0.0, item1: 1.0},
  {item0: 0.0, item1: 1.0},
  {item0: 0.0, item1: 0.0}
]

Я хочу иметь возможность отсортировать массив так, чтобы item1 чередовалось между 1,0 и 0,0.Будет одинаковое количество единиц и нулей.

Как это можно сделать?

array.sort_by{|x| x[item1]} не получает желаемого результата.

Желаемый результат:

[ 
  {item0: 1.0, item1: 0.0},
  {item0: 0.0, item1: 1.0},
  {item0: 0.0, item1: 0.0},
  {item0: 0.0, item1: 1.0}
]

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Я верю, что это даст вам то, что вы хотите.

data = [{item0: 1.0, item1: 0.0},
        {item0: 0.0, item1: 1.0},
        {item0: 0.0, item1: 1.0},
        {item0: 0.0, item1: 0.0}]

zeros, ones = data.partition{ |i| i[:item1] == 0 }

# This does the same
# ones   = data.select { |x| x[:item1] == 1 }
# zeros = data.select { |x| x[:item1] == 0 }

ones.zip(zeros).flatten.compact

Получил идею из этого отличный ответ

0 голосов
/ 20 апреля 2019
 evens, odds = my_array.partition{|i| i[:item1] == 0 }
 alternating = []
 max = [evens.size, odds.size].max
 t = 0
 while t < max + 1
    alternating << evens[t] unless evens[t].nil?
    alternating << odds[t] unless odds[t].nil?
    t += 1
 end

alternating

Если есть большая разница в размере, вышеприведенное должно сгруппировать все оставшееся значение в конце. Если это не то, что вам нужно, измените max на min.

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