___ tag123ruby ___ Ruby ist eine multi-plattform Open-Source, dynamische objektorientierte interpretierte Sprache, erstellt von Yukihiro Matsumoto (Matz) im Jahr 1995. Die [Ruby] -Tag ist für Fragen im Zusammenhang mit der Ruby-Sprache, einschließlich seiner Syntax und seiner Bibliotheken . Fragen speziell zum Ruby-on-Rails-Framework sollten mit [ruby-on-rails], nicht [ruby] getaggt werden. Verwenden Sie dies nicht, um Ruby in der japanischen Sprache zu markieren. ___ tag123sorting ___ Sortierung ist der Vorgang, bei dem eine Reihenfolge auf eine Objektgruppe angewendet wird. ___ tag123operators ___ Operatoren sind Symbole, die in fast allen Programmier- und Codierungssprachen vorkommen, um Berechnungen und Vergleiche von Daten durchzuführen. ___ qstntxt ___

Ich habe eine Sammlung von Post-Objekten und möchte sie basierend auf diesen Bedingungen sortieren können:

  • Zuerst nach Kategorie (Nachrichten, Veranstaltungen, Labs, Portfolio, etc.)
  • Nach Datum, Datum oder nach Position, wenn ein bestimmter Index für ihn festgelegt wurde

Einige Beiträge haben Daten (Nachrichten und Ereignisse), andere haben explizite Positionen (Labs und Portfolio).

Ich möchte %code% aufrufen können, also habe ich %code% außer Kraft gesetzt, aber ich suche nach dem effektivsten Weg, nach diesen Bedingungen zu sortieren. Unten ist eine Pseudo-Methode:

%Vor%

Es sieht so aus, als müsste ich eigentlich zwei getrennte Zeiten sortieren, anstatt alles in diese eine Methode zu stopfen. So etwas wie %code% , dann %code% . Was ist der rubinste Weg, dies zu tun?

    
___ answer2634211 ___

Sie sollten immer nach den gleichen Kriterien sortieren, um eine sinnvolle Reihenfolge zu gewährleisten. Wenn man zwei %code% Daten vergleicht, ist es in Ordnung, dass %code% die Reihenfolge beurteilt, aber wenn man ein %code% Datum mit einem festgelegten Datum vergleicht, muss man unabhängig von der Position entscheiden, welche zuerst geht durch Zuordnen von %code% zu einem Tagesweg in der Vergangenheit).

Andernfalls stellen Sie sich Folgendes vor:

%Vor%

Nach Ihren ursprünglichen Kriterien hätten Sie: a & lt; b & lt; c & lt; ein. Also, welche ist die kleinste?

Sie möchten die Sortierung auch sofort durchführen. Verwenden Sie für Ihre %code% Implementierung %code% :

%Vor%

Wenn Sie Ihre Vergleichskriterien nur einmal verwenden oder wenn dieses Kriterium nicht universell ist und Sie daher %code% nicht definieren möchten, können Sie %code% mit einem Block verwenden:

%Vor%

Besser noch, es gibt %code% und %code% , die Sie verwenden können, um ein Array zu erstellen, um zu vergleichen, in welcher Priorität:

%Vor%

Neben der kürzeren Verwendung hat %code% den Vorteil, dass Sie nur ein gut geordnetes Kriterium erhalten können.

Anmerkungen:

  • %code% wurde in Ruby 1.9.2 eingeführt. Sie können %code% mit älteren Rubies verwenden.
  • Ich nehme an, dass %code% keine Unterklasse von %code% ist (in diesem Fall sollte die Sortierung vom db-Server ausgeführt werden).
___ tag123comparisonoperators ___ Vergleichsoperatoren erlauben, wie ihr Name sagt, zwei Werte zu vergleichen und geben normalerweise einen booleschen Wert (wahr oder falsch) zurück. ___ answer2635288 ___

Alternativ können Sie die Sortierung auf einen Schlag in einem Array durchführen. Der einzige Fall, bei dem eines der Attribute null ist, kann trotzdem gehandhabt werden, wenn Sie den Datensatz kennen, indem Sie den entsprechenden Nullschutz auswählen . Es ist auch nicht aus Ihrem Pseudo-Code klar, wenn die Vergleiche von Datum und Position in einer Prioritätsreihenfolge oder der einen oder der anderen aufgelistet sind (d.h. das Verwendungsdatum, wenn es für beide andere Verwendungspositionen existiert). Die erste Lösung geht von Verwendung, Kategorie, gefolgt von Datum, gefolgt von Position

aus %Vor%

Sekunde setzt voraus, dass es sich um ein Datum oder eine Position handelt

%Vor%     
___ tag123spacecraftoperator ___ Fragen zum schwer fassbaren Operator <=>, die in Vergleichen verwendet werden. ___

8

Ich habe eine Sammlung von Post-Objekten und möchte sie basierend auf diesen Bedingungen sortieren können:

  • Zuerst nach Kategorie (Nachrichten, Veranstaltungen, Labs, Portfolio, etc.)
  • Nach Datum, Datum oder nach Position, wenn ein bestimmter Index für ihn festgelegt wurde

Einige Beiträge haben Daten (Nachrichten und Ereignisse), andere haben explizite Positionen (Labs und Portfolio).

Ich möchte posts.sort! aufrufen können, also habe ich <=> außer Kraft gesetzt, aber ich suche nach dem effektivsten Weg, nach diesen Bedingungen zu sortieren. Unten ist eine Pseudo-Methode:

%Vor%

Es sieht so aus, als müsste ich eigentlich zwei getrennte Zeiten sortieren, anstatt alles in diese eine Methode zu stopfen. So etwas wie sort_by_category , dann sort! . Was ist der rubinste Weg, dies zu tun?

    
Lance Pollard 13.04.2010, 23:53
quelle

2 Antworten

12

Sie sollten immer nach den gleichen Kriterien sortieren, um eine sinnvolle Reihenfolge zu gewährleisten. Wenn man zwei nil Daten vergleicht, ist es in Ordnung, dass position die Reihenfolge beurteilt, aber wenn man ein nil Datum mit einem festgelegten Datum vergleicht, muss man unabhängig von der Position entscheiden, welche zuerst geht durch Zuordnen von nil zu einem Tagesweg in der Vergangenheit).

Andernfalls stellen Sie sich Folgendes vor:

%Vor%

Nach Ihren ursprünglichen Kriterien hätten Sie: a & lt; b & lt; c & lt; ein. Also, welche ist die kleinste?

Sie möchten die Sortierung auch sofort durchführen. Verwenden Sie für Ihre <=> Implementierung #nonzero? :

%Vor%

Wenn Sie Ihre Vergleichskriterien nur einmal verwenden oder wenn dieses Kriterium nicht universell ist und Sie daher <=> nicht definieren möchten, können Sie sort mit einem Block verwenden:

%Vor%

Besser noch, es gibt sort_by und sort_by! , die Sie verwenden können, um ein Array zu erstellen, um zu vergleichen, in welcher Priorität:

%Vor%

Neben der kürzeren Verwendung hat sort_by den Vorteil, dass Sie nur ein gut geordnetes Kriterium erhalten können.

Anmerkungen:

  • sort_by! wurde in Ruby 1.9.2 eingeführt. Sie können require 'backports/1.9.2/array/sort_by' mit älteren Rubies verwenden.
  • Ich nehme an, dass Post keine Unterklasse von ActiveRecord::Base ist (in diesem Fall sollte die Sortierung vom db-Server ausgeführt werden).
Marc-André Lafortune 14.04.2010, 00:54
quelle
3

Alternativ können Sie die Sortierung auf einen Schlag in einem Array durchführen. Der einzige Fall, bei dem eines der Attribute null ist, kann trotzdem gehandhabt werden, wenn Sie den Datensatz kennen, indem Sie den entsprechenden Nullschutz auswählen . Es ist auch nicht aus Ihrem Pseudo-Code klar, wenn die Vergleiche von Datum und Position in einer Prioritätsreihenfolge oder der einen oder der anderen aufgelistet sind (d.h. das Verwendungsdatum, wenn es für beide andere Verwendungspositionen existiert). Die erste Lösung geht von Verwendung, Kategorie, gefolgt von Datum, gefolgt von Position

aus %Vor%

Sekunde setzt voraus, dass es sich um ein Datum oder eine Position handelt

%Vor%     
naven87 14.04.2010 06:27
quelle