Как я могу отсортировать по нескольким условиям с различными заказами?

Опция с использованием data.table

data.table::transpose(asdf)
#[[1]]
#[1]  1 10

#[[2]]
#[1]  2 20

#[[3]]
#[1]  3 30

#[[4]]
#[1]  4 40

#[[5]]
#[1]  5 50 
18
задан PJ. 16 September 2008 в 14:47
поделиться

4 ответа

Как насчет:


ordered_list = [[1, "b"], [1, "a"], [2, "a"]]
ordered_list.sort! do |a,b|
  [a[0],b[1]] <=> [b[0], a[1]]
end

33
ответ дан 30 November 2019 в 06:23
поделиться

Я имел эту ту же основную проблему и решил ее путем добавления этого:

class Inverter
  attr_reader :o

  def initialize(o)
    @o = o
  end

  def <=>(other)
    if @o.is && other.o.is
      -(@o <=> other.o)
    else
      @o <=> other.o
    end
  end
end

Это - обертка, которая просто инвертирует < => функция, которая затем позволяет Вам делать вещи как это:

your_objects.sort_by {|y| [y.prop1,Inverter.new(y.prop2)]}
4
ответ дан 30 November 2019 в 06:23
поделиться

Enumerable#multisort универсальное решение, которое может быть применено к массивам любой размер , не только те, которые имеют 2 объекта. Аргументами являются булевские переменные, которые указывают, должно ли определенное поле быть отсортировано, возросши или убывая (использование ниже):

items = [
  [3, "Britney"],
  [1, "Corin"],
  [2, "Cody"],
  [5, "Adam"],
  [1, "Sally"],
  [2, "Zack"],
  [5, "Betty"]
]

module Enumerable
  def multisort(*args)
    sort do |a, b|
      i, res = -1, 0
      res = a[i] <=> b[i] until !res.zero? or (i+=1) == a.size
      args[i] == false ? -res : res
    end
  end
end

items.multisort(true, false)
# => [[1, "Sally"], [1, "Corin"], [2, "Zack"], [2, "Cody"], [3, "Britney"], [5, "Betty"], [5, "Adam"]]
items.multisort(false, true)
# => [[5, "Adam"], [5, "Betty"], [3, "Britney"], [2, "Cody"], [2, "Zack"], [1, "Corin"], [1, "Sally"]]
4
ответ дан 30 November 2019 в 06:23
поделиться

Я уже довольно давно использую рецепт Гленна. Устав копировать код из проекта в проект снова и снова, я решил превратить его в жемчужину:

http://github.com/dadooda/invert

2
ответ дан 30 November 2019 в 06:23
поделиться
Другие вопросы по тегам:

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