<RetVar> = sort array <Value>

This forum serves as MSCI Reference at EGOSOFT. It's Read-Only for non MSCI Group members.

Moderators: Scripting / Modding Moderators, MSCI Moderators

Locked
mark_a_condren
Posts: 1385
Joined: Wed, 3. Aug 05, 05:05
x3tc

<RetVar> = sort array <Value>

Post by mark_a_condren » Tue, 14. Sep 10, 17:23

<RetVar> = sort array <Value>


<RetVar> = The name for the sorted array, this can be the same as the array to be sorted. This array does not have to be pre created, this command will create the new array if it does not exsist.
<Value> = The array that you want to sort the values for.


Sorts the contents of an array alphabetically if it is an alphanumeric list or in ascending order if a numerical list. Numerical will take precedence over alphanumerical.

It should be noted that when sorting includes numerical values, 'lexicographical' (also known as alphanumeric order, dictionary order, alphabetical order ...) sorting is used, a Wiki explanation can be found here. What this means is basically that numerical / integers are treated as 'strings', thus do not follow the conventional numbering system we are used to. Please see 'Known Sorting Issues:' below, for an example of this behaviour.


Example:

$station.array = $sector get station array from sector
$sorted.array = sort array $station.array

The array $sorted.array will now be sorted in decending alphanumeric order.


Known Sorting Issues:

Code: Select all

$Numbers = array alloc: size=6 
$Numbers[0] = 4 
$Numbers[1] = 2 
$Numbers[2] = 24 
$Numbers[3] = 6 
$Numbers[4] = 12 
$Numbers[5] = 1 
  
$Numbers = sort array $Numbers 
  
write to player logbook $Numbers
Output: ARRAY(1, 12, 2, 24, 4, 6)

In layman's terms it's simply doing a string sort (on integers) where "12" naturally comes before "2" because "1" comes before "2".

To overcome this issue, the following command can be used,
<RetVar> = sort array: data= <Value> sort values= <Value>
In this case,

Code: Select all

$Numbers = sort array: data= $Numbers sort values= $Numbers

Command location:
Last edited by mark_a_condren on Wed, 24. Nov 10, 23:46, edited 4 times in total.

User avatar
X2-Illuminatus
Moderator (Deutsch)
Moderator (Deutsch)
Posts: 21588
Joined: Sun, 2. Apr 06, 16:38
x4

[TiP][49] 286903

Post by X2-Illuminatus » Sat, 9. Oct 10, 22:38

<RetVar> = sort array <Value>


<RetVar> = Der Name des sortierten Arrays. Dies kann der gleiche wie der des zu sortierenden Arrays sein. Das Array muss nicht vorher erstellt werden. Dieser Befehl erstellt ein Array, falls es noch nicht existiert
<Value> = Das Array, dessen Werte du sortieren möchtest.


Sortiert den Inhalt eines Arrays alphabetisch, wenn es eine alphanumerische Liste ist, oder aufsteigend, wenn es eine numerische Liste ist. Numerisch geht vor alphanumerisch.

Dabei sollte beachtet werden, dass beim Sortieren numerischer Werte eine lexikographische Ordnung genutzt wird. Ein Wikipedia Artikel zur Erklärung findet sich hier. Dies bedeutet, dass ganze Zahlen sozusagen als Zeichenketten behandelt werden und dementsprechend nicht der "normalen" Zahlenordnung folgen. Unter "Bekannte Sortierfehler" weiter unten findet sich ein Beispiel für dieses Verhalten.


Beispiel:

$station.array = $sector get station array from sector
$sorted.array = sort array $station.array

Das Array $sorted.array wird nun in absteigender, alphanumerischer Reihenfolge geordnet.


Bekannte Sortierfehler:

Code: Select all

$Numbers = array alloc: size=6 
$Numbers[0] = 4 
$Numbers[1] = 2 
$Numbers[2] = 24 
$Numbers[3] = 6 
$Numbers[4] = 12 
$Numbers[5] = 1 
  
$Numbers = sort array $Numbers
Ausgabe: ARRAY(1, 12, 2, 24, 4, 6)

Allgemein gesprochen wird hier ganz einfach das Sortierverhalten von Zeichenketten angewendet. Somit steht "12" vor 2, da "1" vor "2" kommt.

Um dieses Problem zu umgehen, kann der folgende Befehl genutzt werden:
<RetVar> = sort array: data= <Value> sort values= <Value>
Auf dieses Beispiel angewendet

Code: Select all

$Numbers = sort array: data= $Numbers sort values= $Numbers

Zu finden unter:

Locked

Return to “MSCI Reference”