zyklische Sortierung
Ich habe ein array mit zusammenhängenden Zahlen aus der zyklischen Reihe [1,2,3,4,5,6,7,8,9,10,11,12], also z.B.: [3,4,6,7,5| oder [11,3,12,1,2]
Mit zyklisch meine ich: bei 12 angekommen, beginnt es wieder mit 1. Zusammenhängend heißt, dass so etwas wie [3,4,6,7] oder [11,12,3| nicht vorkommt.
Nun möchte ich sortieren aufsteigend, bei [3,4,6,7,5] kein Problem, daraus wird [3,4,5,6,7]
Aus [11,3,12,1,2] soll werden [11,12,1,2,3]
Tipp: beim zweiten Fall kommen 1 und 12 immer vor, weshalb es mir mit zwei while-Schleifen gelingt neben der 1 als Minimum und der 12 als Maximum in dem Array auch die beiden Rand-Zahlen 11 und 3 zu bestimmen:
let n:= 12; let m:= 1
while contains(myArray,n-1) do n:=n-1 end;
while contains(myArray,m+1) do m:=m+1 end
Wie bekomme ich jetzt mit order by eine Sortierung 11,12,1,2,3 hin?
Zum Verständnis: es geht um Prozessbeschreibungen. Die Zahlen 1-12 sind die Monate, wann eine Aufgabe zu erledigen ist. Aufgaben können sich über mehrere Monate hinwegziehen. Die angegebenen Arrays sind die Monate für eine Aufgabe. Eine Aufgabe, die im November beginnt und im März endet soll auch entsprechend mit diesen Bearbeitungsmonaten 11,12,1,2,3 dargestellt werden.
Grüße
Maurice
3 Antworten
-
Versuche es mal so
let ary := [11, 3, 2, 12, 1]; let first := [1][null]; let second := [1][null]; for i in sort(ary) do switch true do case cnt(ary) < 12 and contains(ary, 1) and contains(ary, 12): if length(text(i)) = 2 then first := array(first, [i]) end + if length(text(i)) < 2 then second := array(second, [i]) end default: (first := array(first, [i])) end end; array(first, second)
-
Noch als Ergänzung. Ich habe die Sortierung als globale Funktion eingebaut. Da Ninox in eigenen Funktionen kein array verarbeiten kann, habe ich das unter Nutzung des Beitrages
https://forum.ninox.de/t/60ytkr2/eigener-funktion-als-parameter-ein-array-ubergeben
nun so gelöst. Übergeben wird ein ein concat([number])
function monatsort(arraytext : text) do let ary := [0][null]; for g in split(arraytext, ",") do ary := array(ary, [number(g)]) end; let first := [1][null]; let second := [1][null]; switch true do case contains(ary, 1) and contains(ary, 12): ( let n := 12; let m := 1; while contains(ary, n - 1) do n := n - 1 end ; while contains(ary, m + 1) do m := m + 1 end ; for a from 1 to m + 1 do second := array(second, [a]) end; for b from n to 13 do first := array(first, [b]) end ) default: for c in ary do first := sort(array(first, [c])) end end; array(first, second) end;
Content aside
- Status Answered
- vor 1 MonatZuletzt aktiv
- 3Antworten
- 18Ansichten
-
2
Folge bereits