Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 1 | SYNOPSIS |
| 2 | mixed * sort_array(mixed *arr, string wrong_order) |
| 3 | mixed * sort_array(mixed *arr, string wrong_order, object|string ob) |
| 4 | mixed * sort_array(mixed *arr, string wrong_order, object|string ob, |
| 5 | mixed extra...) |
| 6 | mixed * sort_array(mixed *arr, closure cl) |
| 7 | mixed * sort_array(mixed *arr, closure cl, mixed extra...) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 8 | |
| 9 | BESCHREIBUNG |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 10 | Sortiert das Array <arr> entweder nach der Ordnungsfunktion |
| 11 | <ob->wrong_order(a, b)> oder nach der Closure cl. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 12 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 13 | Normalerweise wird zuerst eine flache Kopie des Arrays <arr> erstellt |
| 14 | und die sortierte Kopie als Ergebnis zurueckgeliefert. Wird <arr> |
| 15 | jedoch als Referenz uebergeben, wird keine implizite Kopie erstellt |
| 16 | und das Originalarray sortiert. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 17 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 18 | Wenn das Argument <arr> 0 ist, ist das Resultat der Funktion auch 0. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 19 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 20 | <ob> ist das Objekt, in dem die Ordnungsfunktion <wrong_order()> |
| 21 | aufgerufen wird. <ob> kann das Objekt als solches enthalten, oder |
| 22 | einen String mit dem Objektnamen. Wird <ob> nicht angegeben, oder |
| 23 | enthaelt es weder einen String noch ein Objekt, wird stattdessen |
| 24 | this_object() verwendet. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 25 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 26 | Die Elemente von <arr> werden paarweise an die Ordnungsfunktion |
| 27 | <wrong_order()> als Argumente uebergeben, gefolgt von den <extra> |
| 28 | Argumenten, falls vorhanden. Die Ordnungsfunktion <wrong_order> sollte |
| 29 | eine positve Zahl liefern, wenn die paarweisen Elemente in der |
| 30 | falschen Reihenfolge waren, 0 oder eine negative Zahl sonst. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 31 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 32 | BEISPIELE |
| 33 | Um folgendes Array in aufsteigender Reihenfolge zu ordnen: |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 34 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 35 | arr = ({ 3, 8, 1, 3 }) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 36 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 37 | wird als Ordnungsfunktion ist_groesser() verwendet: |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 38 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 39 | int ist_groesser(int a, int b) { |
| 40 | return a > b; |
| 41 | } |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 42 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 43 | Folgende Aufrufe von sort_array() sind alle aequivalent: |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 44 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 45 | arr = sort_array(arr, "ist_groesser", this_object()) |
| 46 | arr = sort_array(arr, "ist_groesser") |
| 47 | arr = sort_array(arr, #'ist_groesser) |
| 48 | arr = sort_array(arr, #'>) //dies ist die bevorzugte Variante :-) |
| 49 | arr = sort_array(arr, lambda(({'a, 'b}), ({#'>, 'a, 'b}))) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 50 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 51 | Soll direkt das Original <arr> statt einer impliziten Kopie sortiert |
| 52 | werden: |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 53 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 54 | sort_array(&arr, #'>) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 55 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 56 | Etwas komplizierter ist es, folgendes Array aufsteigend nach dem |
| 57 | zweiten Argument jedes Teilarrays zu ordnen: |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 58 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 59 | arr = ({ ({ "foo", 3 }), ({ "quux", 1 }), ... }) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 60 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 61 | Dafuer muss die Ordnungsfunktion folgende Form annehmen: |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 62 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 63 | int ist_groesser(mixed *a, mixed *b) { |
| 64 | return a[1] > b[1]; |
| 65 | } |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 66 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 67 | GESCHICHTE |
| 68 | LDMud 3.2.8 fuehrte die Moeglichkeit ein, zusaetzliche Argumente |
| 69 | <extra> zu uebergeben. |
| 70 | LDMud 3.3.720 unterstuetzt die Uebergabe von <arr> als Referenz und |
| 71 | sortiert das Original statt einer impliziten flachen Kopie. |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 72 | |
Zesstra | b6ac9f6 | 2020-01-21 11:11:16 +0100 | [diff] [blame] | 73 | SIEHE AUCH |
| 74 | transpose_array(E), filter(E), map(E), alists(LPC) |