Page 1 of 1

Feststellen ob die Liste aufsteigend sortiert ist

Posted: 14 Oct 2019, 08:06
by KHA
Hallo,
wie kann ich überprüfen, ob eine Liste aufsteigend sortiert ist, die liste soll nicht sortiert werden

z.B

Code: Select all

A1001	Auto	Schwarz
A1002	Fahrrad Grün
A1003	LKW	Weiss
=> True

Code: Select all

A1003	LKW	Weiss
A1001	Auto	Schwarz
A1002	Fahrrad Grün
=> False

LG

Re: Feststellen ob die Liste aufsteigend sortiert ist  Topic is solved

Posted: 14 Oct 2019, 08:28
by just me
Für das konkrete Beispiel z.B.:

Code: Select all

#NoEnv
Liste1 =
(Join`r`n
A1001	Auto	Schwarz
A1002	Fahrrad Grün
A1003	LKW	Weiss
)

Liste2 =
(Join`r`n
A1003	LKW	Weiss
A1001	Auto	Schwarz
A1002	Fahrrad Grün
)

MsgBox, 0, Liste1, % "IsSorted = " . IsSorted(Liste1)
MsgBox, 0, Liste2, % "IsSorted = " . IsSorted(Liste2)

ExitApp

IsSorted(ByRef Data) {
   VorZeile := ""
   Loop, Parse, Data, `n, `r
   {
      If (A_LoopField < VorZeile)
         Return False
      VorZeile := A_LoopField
   }
   Return True
}

Re: Feststellen ob die Liste aufsteigend sortiert ist

Posted: 14 Oct 2019, 11:53
by KHA
Vielen Dank @just me es funktioniert super.
Was ich nicht verstehe, warum es funktioniert.
Meine ursprüngliche Idee war, so etwas ähnliches. Es hat aber nicht funktioniert weil, Vorzeile ist am Anfang immer 0, wenn die Schleife zum ersten mal läuft, gibt es einen Vergleich I If (A_LoopField < VorZeile) das Ergebnis der IF-Anfrage ist immer False.
Wieso funktioniert es bei dir? Hat es etwas mit ByRef zu tuen?

Code: Select all

#NoEnv
Liste1 =
(Join`r`n
A1001	Auto	Schwarz
A1002	Fahrrad Grün
A1003	LKW	Weiss
)

Liste2 =
(Join`r`n
A1003	LKW	Weiss
A1001	Auto	Schwarz
A1002	Fahrrad Grün
)




VorZeile =

   Loop, Parse, Liste1, `n, `r
   {
      If (A_LoopField < VorZeile)
      VorZeile := A_LoopField
   }

if VorZeile =
msgbox, Ja ist sortfiert

Re: Feststellen ob die Liste aufsteigend sortiert ist

Posted: 16 Oct 2019, 02:36
by just me
Die Variable VorZeile ist nicht 0 sondern leer. Weil es keine Zeichenkette geben kann, die kleiner als die leere Zeichenkette ist, ergibt der erste Vergleich If (A_LoopField < VorZeile) immer falsch. Meine Funktion macht dann einfach weiter und aktualisiert den Inhalt von VorZeile. Nur wenn tatsächlich eine Zeile gefunden wird, die kleiner ist als die Vorzeile, wird sofort False zurückgegeben.

In Deinem Beispiel wird der Inhalt der Variablen VorZeile nur dann aktualisiert, wenn tatsächlich eine kleinere Zeile gefunden wird. Weil das nicht möglich ist, bleibt sie leer, d.h. das Ergebnis ist immer "Ja ist sortiert".

Eine mögliche Alternative für Deinen Code wäre

Code: Select all

#NoEnv
Liste1 =
(Join`r`n
A1001	Auto	Schwarz
A1002	Fahrrad Grün
A1003	LKW	Weiss
)
;
Liste2 =
(Join`r`n
A1003	LKW	Weiss
A1001	Auto	Schwarz
A1002	Fahrrad Grün
)
;
VorZeile := ""
Sortiert := True
Loop, Parse, Liste1, `n, `r
{
   If (A_LoopField < VorZeile) {
      Sortiert := False
      Break
   }
   VorZeile := A_LoopField
}
MsgBox, 0, Liste1, Ist sortiert = %Sortiert%
;
VorZeile := ""
Sortiert := True
Loop, Parse, Liste2, `n, `r
{
   If (A_LoopField < VorZeile) {
      Sortiert := False
      Break
   }
   VorZeile := A_LoopField
}
MsgBox, 0, Liste1, Ist sortiert = %Sortiert%
;
ExitApp

Re: Feststellen ob die Liste aufsteigend sortiert ist

Posted: 16 Oct 2019, 11:10
by KHA
Dankeschön!.

Re: Feststellen ob die Liste aufsteigend sortiert ist

Posted: 17 Oct 2019, 05:20
by just me
Bitte sehr! ;)