Сортировка массива массивов в Ruby

Вы найдете в двоичном формате максимальное значение Int32 1111111111111111111111111111111, но в десяти основаниях вы найдете 2147483647 или 2 ^ 31-1 или Int32.MaxValue

22
задан Tyler K 28 July 2009 в 15:01
поделиться

3 ответа

Вы не можете использовать <=> с nil .

Ваш код должен быть примерно таким:

AllDevicesController.all_devices.sort do |a, b|
  a[4].nil? ? -1 : b[4].nil? ? 1 : a[4] <=> b[4]
end

Это поставит подмассивы, у которых нет элемента индекса 4 в начале результата. Чтобы сделать это наоборот, замените -1 на 1 .

Вы также можете использовать sort_by вместо sort . Я думаю, что это было введено в Ruby 1.8.7 (поэтому это может не сработать, если вы используете старую версию). Это выглядит примерно так:

AllDevicesController.all_devices.sort_by { |e| e.nil? ? 0 : e[4] }

Это будет обрабатывать подмассивы без 4-го элемента, как если бы он был 0. Измените эту константу по своему усмотрению.

РЕДАКТИРОВАТЬ:

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

AllDevicesController.all_devices.sort do |a, b|
  a[4] <=> b[4]
end

Или простым (при условии, что Ruby 1.8.7 или более поздней версии):

AllDevicesController.all_devices.sort_by { |e| e[4] }

В обоих случаях

29
ответ дан 29 November 2019 в 04:57
поделиться

Четвертый элемент на самом деле имеет индекс 3, что означает, что вы должны сделать это следующим образом:

all_devices.sort do |a, b|
  a[3] <=> b[3]
end

Если вы действительно хотите отсортировать элементы по индексу 4 (который не существует для первый элемент all_devices ), тогда вам нужно сначала добавить сравнение к NilClass:

class NilClass
  def <=> (other)
    1
  end
end

all_devices.sort do |a, b|
  a[4] <=> b[4]
end

Это отсортирует nil до конца. Измените возвращаемое значение <=> на -1, чтобы отсортировать их вперед.

2
ответ дан 29 November 2019 в 04:57
поделиться

Я знаю, что на этот вопрос был дан ответ, и сейчас я не собираюсь его рассматривать, но ...

Вы уверены, что массив лучше всего подходит для этих данных? Я говорю об этих элементах данных: ["name1", "type1", ["A", "N", "N"], ["Attribute", "device_attribute"], 9]

Похоже на Struct или что-то еще может быть более подходящим и управляемым для этого, и тогда у вас может быть массив структур. Просто идея.

2
ответ дан 29 November 2019 в 04:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: