Pergunta

Minhas desculpas se isso já foi respondido antes ou é óbvio ... algumas pesquisas aqui e no Googre e não conseguiram encontrar uma resposta.

Estou procurando classificar uma variedade de fornecedores por preço e se eles são um preferido_provider? (verdadeiro ou falso)

Por exemplo array p of Providers...

p1.price == 1, p1.preferred_provider? == false
p2.price == 2, p2.preferred_provider? == true
p2.price == 3, p3.preferred_provider? == true

Eu gostaria de p.sort_by e obter:

[p2 p3 p1]

IAW

p.sort_by {|x| x.preferred_provider?, x.price }

não funciona e fica ...

undefined method `<=>' for false:FalseClass

Alguma sugestão sobre melhores maneiras de abordar esse problema?

Foi útil?

Solução

A maioria dos idiomas fornece funções de classificação que aceitam comparadores Para esse tipo de coisa. Em Ruby, isso é apenas Array.Sort:

p.sort {|a, b| if (a.preferred_provider? == b.preferred_provider?
               then a.price <=> b.price
               elsif a.preferred_provider?
                    1
               else -1
       }

Outras dicas

Você poderia definir um <=> no Provider classe para fazer o que quiser e depois classificar usando o Array.sort método (ao invés de Enumerable.sort_by). Aqui está uma definição de <=> que eu preparei:

class Provider
  def <=>(other)
    if preferred_provider?
      if other.preferred_provider?
        @price <=> other.price
      else
        1
      end
    else
      if other.preferred_provider?
        -1
      else
        @price <=> other.price
      end
    end
  end
end

Então, se você tiver sua matriz p, você poderia simplesmente fazer p_sorted = p.sort.

(Observe que eu não testei este código, então pode haver alguns erros, mas acho que serve para demonstrar a ideia.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top