Проблемы с использованием `elsif` в блоке` sort` - PullRequest
0 голосов
/ 24 января 2019

У меня есть этот массив:

ary = [[1, 6, 7], [1, 4, 9], [1, 8, 3]]

Я хочу отсортировать его по первому нечетному числу или по последнему числу, если они все четные, в каждом подмассиве.

Посколькупервый элемент в каждом массиве - это один и тот же объект 1 для этого конкретного ary, я могу решить это следующим образом:

ary2 = ary.sort_by { |a, b, c| b.odd? ? b : c }

Но когда я попробую более общий:

arr2 = ary.sort_by { |a, b, c| a.odd? ? a : b.odd? ? b : c }

ary2 возвращается без сортировки.

Я пытался удалить троичные операторы следующим образом:

ary2 = ary.sort_by do |a, b, c|
  if a.odd? 
    a
  elsif b.odd?
    b
  else
    c
  end
end

с тем же эффектом (т. Е. Без).

Есть ли какая-то причина, по которой elsif нельзя использовать в блоках, переданных методу sort_by?


Редактировать: Аксиак указал на проблему с моей логикой.Похоже, что условная логика имеет дело со всеми возможными перестановками нечетных и четных значений.Это работает:

arr2 = arr.sort_by do |a, b, c| 
  if a.odd?
    if b.odd?
      if c.odd?
        [a, b, c]
      else
        [a, b]
      end
    elsif c.odd?
      [a, c]
    else
      a
    end
  elsif b.odd?
    if c.odd?
      [b, c]
    else
      b
    end
  else
    c
  end
end

Возможно, есть более лаконичный и менее хрупкий способ сделать это, но, вероятно, лучше сделать это так:

arr2 = arr.sort_by do |sub_arr|
  temp = sub_arr.select do |e|
    e.odd?
  end
  temp.empty? ? Array(sub_arr.last) : temp
end

Я будуУвидимся.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Что касается вашего исходного вопроса, так же, как аксиак указывает в комментарии, результат сортировки должен быть точно таким же, как и у входного массива, поскольку все они отсортированы по первому нечетному элементу в каждом подмассиве, который равен 1и метод сортировки в МРТ стабилен.


Что касается вашего вопроса после редактирования, мой ответ будет таким:

ary.sort_by{|a| a[0...-1].select(&:odd?) << a.last}
# => [[1, 8, 3], [1, 6, 7], [1, 4, 9]]

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

0 голосов
/ 24 января 2019

Я считаю постановку вопроса неоднозначной. Я дам ответ, который состоит из одной интерпретации. Если это не то, что вам нужно, уточните вопрос.

def my_sort(arr)
  arr.sort_by {|a| a.any?(&:odd?) ? a.map {|e| e.odd? ? e : Float::INFINITY} : [a.last]}
end

my_sort [[1, 6, 7], [1, 4, 9], [1, 2, 3]]
  #=>   [[1, ∞, 7], [1, ∞, 9], [1, ∞, 3]] (sort_by)
  #=>   [[1, 2, 3], [1, 6, 7], [1, 4, 9]]
my_sort [[3, 6, 7], [4, 1, 9], [5, 8, 1]]
  #=>   [[3, ∞, 7], [∞, 1, 9], [5, ∞, 1]] (sort_by) 
  #=>   [[3, 6, 7], [5, 8, 1], [4, 1, 9]] 
my_sort [[2, 6, 8], [4, 1, 4], [8, 6, 2]]
  #=>   [[8],       [∞, 1, ∞], [2]]       (sort_by) 
  #=>   [[8, 6, 2], [2, 6, 8], [4, 1, 4]] 
my_sort [[8, 6, 2], [5, 1, 1], [6, 8, 4]]
  #=>   [[2],       [5, 1, 1], [4]        (sort_by) 
  #=>   [[8, 6, 2], [6, 8, 4], [5, 1, 1]] 

Для каждого примера я показал массивы, используемые sort_by для получения сортировки, показанной в следующей строке.

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