0

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

null
    • mirko3
    • vor 1 Monat
    • Gemeldet - anzeigen

    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)
    
      • Maurice
      • vor 1 Monat
      • Gemeldet - anzeigen

       Danke. Und wie so oft hier, weil man den konkreten Fall nicht ausreichend darstellt (darstellen kann), war das zwar nicht ganz die Lösung, hat mich aber auf den richtigen Weg geführt. Vielen Dank. Es gibt beispielsweise auch ein array wie [9,10,11,3,2,12,1]. Die Idee auf zwei Arrays aufzuteilen und dann zusammen zuführen, das war der entscheidende Hinweis. Für den ersten case (den nicht-trivialen) sieht meine Lösung jetzt so aus: oben zwei Beispielarrays zum Testen

      let ary := [11, 3, 2, 12, 1];
      let ary := [9, 10, 11, 3, 2, 12, 1];
      let first := [1][null];
      let second := [1][null];
      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 i from 1 to m + 1 do
          second := array(second, [i])
      end;
      for j from n to 13 do
          first := array(first, [j])
      end;
      array(first, second)
      
    • Maurice
    • vor 1 Monat
    • Gemeldet - anzeigen

    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