Ответ 1
С выражением case:
ar.sort do |a, b|
case
when a.x < b.x
-1
when a.x > b.x
1
else
a.y <=> b.y
end
end
С тройной:
ar.sort { |a,b| a.x < b.x ? -1 : (a.x > b.x ? 1 : (a.y <=> b.y)) }
Я хочу указать метод настраиваемого блока для сортировки массива объектов в ruby, оценив два свойства. Однако после многих поисков в google я не попал ни в один пример без оператора <= > .
Это то, что я хочу сделать: сравнивая vs b:
if a.x less than b.x return -1
if a.x greater than b.x return 1
if a.x equals b.x, then compare by another property , like a.y vs b.y
это мой код (noob в ruby, извините), и он не работает...
ar.sort! do |a,b|
if a.x < b.y return -1
elseif a.x > b.x return 1
else return a.y <=> b.y
end
Этот блок находится внутри функции, поэтому возврат возвращается из функции и возвращает -1... Я буду признателен за любую помощь в этом.
С уважением.
С выражением case:
ar.sort do |a, b|
case
when a.x < b.x
-1
when a.x > b.x
1
else
a.y <=> b.y
end
end
С тройной:
ar.sort { |a,b| a.x < b.x ? -1 : (a.x > b.x ? 1 : (a.y <=> b.y)) }
Это даст вам возрастающий порядок для x, тогда для y:
points.sort_by{ |p| [p.x, p.y] }
Это работает:
# Ascending
ar.sort! do |a,b|
(a-b).abs() > 0 ? a-b : 0
end
# Descending
ar.sort! do |a,b|
(a-b).abs() > 0 ? b-a : 0
end
Нет необходимости в операторе космического корабля (<=>
) - он кажется излишним в Ruby (в терминах эффективности синтаксиса), поскольку Ruby считает, что 0
является истинным, и для этого использования (выше) вы можете просто поместить явный 0
в тернарный оператор.