2017-02-02 5 views

Antwort

1

Die Funktion sortedBy sortiert Elemente anhand der in ihrem Körper ausgedrückten Kriterien und einer < Beziehung zwischen jedem gesammelten Ergebnis.

In Ihrem Fall davon aus, dass Sie ein surname Attribut, die folgende Anweisung wird die Sammlung c mit dem < Betreiber auf jeden Namen versammelt (so ein < auf strings) sortieren:

c->sortedBy(p | p.surname) 

Eine Idee könnte sei es, eine eindeutige Zeichenkette zu berechnen, die den Nachnamen und den zusammengehängten Namen verwendet. Wenn Sie also haben:

  • George Smith
  • Garry Smith
  • George Smath

Der Vergleich zwischen "Smith_George", "Smith_Garry" und "Smath_George" und wäre geschehen würde bestellt, nach der lexikographischen Reihenfolge zu:

  1. George Smath (Sm ein t h_George)
  2. Garry Smith (Smith_G ein rry)
  3. George Smith (smith_G e Orge)

Schließlich ist die OCL Anfrage wäre (unter der Annahme surname und name als bestehende Attribute):

Dieser kleine Trick macht den Job, aber es ist nicht "genau" ein Vergleich zweier Parameter für sortledBy.

+0

Es scheint mir, dass diese Lösung nicht in allen Fällen funktioniert, Ich brauche etwas Univ ersalen. Diese Lösung wird falsch sein, wenn wir zum Beispiel zwei Daten haben. Zum Beispiel das Datum, an dem das Projekt gestartet wurde und das Datum, an dem das Projekt beendet wurde. Was kann ich in solchen Fällen verwenden? – DM14

+0

Wie gesagt, diese Lösung arbeitete in Ihrem speziellen Fall mit Name/Nachname ist es lexikographischer Reihenfolge verwendet wird. Ich bin mir nicht sicher, aber ich denke nicht, dass OCL SortedBy Funktion diese Zwei-Kriterien-Suche durchführen kann. In anderen Fällen sollte ein anderer Trick gefunden werden. In Ihrem Start-/Enddatum-Beispiel könnten Sie die Zeit berechnen, die jedes Projekt mit dem End-/Startdatum verbracht hat, und diese nach diesen Kriterien sortieren. Andernfalls, Übersetzen Datum in einem Format JJJ-MM-TT (mit Significative 0 obvioulsy), sollte der String-Trick mit der lexikographischen Reihenfolge arbeiten. –

0

Die OCL sortedBy (Lambda) scheint sich sehr von der Java-Sortierung (Komparator) zu unterscheiden, die offensichtlich eine Projektion der Objekte als Metrik zum Sortieren erfordert. Wenn die Projektion jedoch selbst ist, haben Sie eine andere Java-Funktionalität. Wenn Sie also sortledBy (p | p) ausführen, hängt die Sortierung von der Operation < für p ab.

Um dies zu erleichtern, führt der Eclipse-OCL-Prototyp einer zukünftigen OCL einen OclComparable-Typ mit einer compareTo-Methode ein, die alle relationalen Operationen ermöglicht, sofern Ihr benutzerdefinierter Typ den OclComparable-Typ erweitert.

(Ein ähnliches OclSummable mit Null() und sum() arbeitet unterstützt Collection :: sum() allgemein;. B. String realisiert Summe als eine Verkettung)

0

Dank Sie mich inspiriert. Ich habe gerade http://issues.omg.org/browse/OCL25-213 aufgewachsen, deren Text lautet:

Die sortedBy-Iteration bietet eine elegante Lösung für ein Sortierproblem, bei dem die Sortiermetrik eine Projektion des sortierten Objekts ist. So ist sortedBy (p | p.name) oder nur sortledBy (name) kurz und vermeidet Tippfehler aus einer konventionelleren Darstellung, bei der zwei Objekte verglichen werden.Die natürliche Lösung ist möglicherweise eine effiziente Lösung für große Sammlungen mit nicht-trivialen Metriken.

Die sortedBy-Lösung ist jedoch unbekannt und für Neueinsteiger so verwirrend und ungeeignet für die Sortierung mit mehreren Schlüsseln, für die ein künstlicher Verbindungsschlüssel konstruiert werden muss.

sort (p1, p2 | lassen diff1 = p1.key1.compareTo: so dass ein zwei Schlüssel sortieren |

Eine Lösung könnte eine konventionellere Iterator wie sort (Vergleichsausdruck P1, P2), um seine (p2.key1) in wenn diff1 <> 0 die diff 1 sonst p1.key2.compareTo (p2.key2) endif)

jedoch diese schlechte Lesbarkeit und zahlreiche Möglichkeiten für Tippfehler hat.

sortedBy (Tuple {first = Key1, second = key2})

(siehe alphabetische Reihenfolge der Tuple Teilenamen bestimmt der:

Alternativ sortedBy mit einem Tuple-wertige metric könnten mehrere Schlüssel als Stütz Priorität.)

Äquivalente (Da sortedBy ihre Art (optimiert werden können deklarativ klar und kompakt, ineffizient kleinen/triviale Implementierungen ist).)