Feststellen ob die Liste aufsteigend sortiert ist Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Feststellen ob die Liste aufsteigend sortiert ist

14 Oct 2019, 08:06

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
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

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

14 Oct 2019, 08:28

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
}
KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Re: Feststellen ob die Liste aufsteigend sortiert ist

14 Oct 2019, 11:53

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
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Feststellen ob die Liste aufsteigend sortiert ist

16 Oct 2019, 02:36

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

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 17 guests