Page 1 of 2

Ahnunglosigkeit ...

Posted: 10 Jul 2020, 08:24
by BoBo
... macht sich breit, zwischen meinen Schläfen. :crazy:

Folgende Konstellation:

aaa
bbbbbbbbbb
ccc
1234567890
bbb
xxxxxxx


Möchte jetzt dieses in ein assoziatives array überführen ...
array := {"aaa":"bbbbbbbbbb","ccc":"1234567890","bbb":"xxxxxxx"}
anschließend soll nach keys alphabetisch sortiert werden ...
so, das die finale ausgabe (nicht zwingend das array) wie folgt aussieht:

aaa
bbbbbbbbbb
bbb
xxxxxxx
ccc
1234567890


Die eigentliche frage, wie ermittle ich die keys eines ass. arrays im nachhinein (ungeachtet ob es sinnvollere möglichkeiten im voraus gibt)??
Vermutlich die offensichtlichste methode der welt, doch ich bekomme aus der AHK hilfe für mich nichts nachvollziehbares extrahiert :x

Danke fürs Lesen :)

Re: Ahnunglosigkeit ...

Posted: 10 Jul 2020, 08:45
by gregster
Mit for, würde ich sagen:

Code: Select all

array := {"aaa":"bbbbbbbbbb","ccc":"1234567890","bbb":"xxxxxxx"}

for key, value in array
	msgbox % "Key: " key "  Value: " value

for key, value in array
	str .= key "`n" value "`n"	
msgbox % str
Oder verstehe ich die Frage falsch?

Re: Ahnunglosigkeit ...

Posted: 10 Jul 2020, 08:47
by Rohwedder
Hallo,
versuch mal:

Code: Select all

array := {aaa:"bbbbbbbbbb",ccc:"1234567890",bbb:"xxxxxxx"}
For key, value in array
	MsgBox %key% = %value%

Re: Ahnunglosigkeit ...

Posted: 10 Jul 2020, 08:52
by gregster
Oder:

Code: Select all

array := {"aaa":"bbbbbbbbbb","ccc":"1234567890","bbb":"xxxxxxx"}

enum := array._NewEnum()
While enum[k, v]
    str .= k "`n" v "`n"
MsgBox % str

Re: Ahnunglosigkeit ...

Posted: 10 Jul 2020, 08:53
by BoBo
Ich hatte tatsächlich mit For ... in angefangen, und aus geistiger Umnachtung auf Loop gewechselt.
Manchmal komm ich mir vor wie ein Einbeiniger beim Arschtritt-contest :crazy: :lolno: :shifty:

Danke :)

Re: Ahnunglosigkeit ...

Posted: 10 Jul 2020, 10:56
by effel
Darf ich fragen, warum die Ausgabe jetzt eine andere Sortierung hat? welche Zeile ist für die Sortierung zuständig?

Oder anders gefragt, wenn ich nun eine andere Sortierung brauche, wie ginge das?

Re: Ahnunglosigkeit ...

Posted: 10 Jul 2020, 15:49
by just me
In AHK 1.1 werden sowohl numerische als auch nicht numerische Schlüssel immer automatisch aufsteigend sortiert. Numerische Schlüssel in lückenlosen 'simple arrays' lassen sich auch mit der Loop Anweisung abgreifen. Generell ist aber bei assoziativen Arrays For das Mittel der Wahl.

Re: Ahnunglosigkeit ...

Posted: 10 Jul 2020, 16:20
by BoBo
effel wrote:
10 Jul 2020, 10:56
Darf ich fragen, warum die Ausgabe jetzt eine andere Sortierung hat? Hier wurde lediglich das Ziel skizziert.
Welche Zeile ist für die Sortierung zuständig? Noch keine, s.o.

Oder anders gefragt, wenn ich nun eine andere Sortierung brauche, wie ginge das? Ich verwend(et)e AHK's Sort-Befehl
Hier noch (m)eine Lösung mit einer vorab-Sortierung der keys, zeitgleich zur Befüllung des arrays, und nachfolgender Abfrage des arrays zur Ausgabe.

Code: Select all

content =
	(LTrim
	blue
	|<>*43$17.5VUHl07W14J27p2iGeQUXIo1hs0oU0V023U
	green
	|<>*47$8.400026Vy+mVCpzeGM+0ks62
	red
	|<>*53$11.0EUF020U7dAN902E3gX80QNe40W001kE
	yellow
	|<>*48$17.0/U8K3k43EU2+eABg09Y1dA0a817k1JU0UU
	gray
	|<>*51$17.00U0B00U01A0UMK0UMlU+XVgn14628I20I45o60U43A
	white
	|<>*134$17.zjzzzwzzbzxhTxyzzzzz1y6STA
	black
	|<>*134$17.zjzzzwzzbzxhTxyzzzzz1y6STA
	)

newContent := "", keys := "", array := {}									; vars & an empty associative array/variablen- & array-deklaration
Loop, Parse, content, `r`n													; parse content for the number of lines/für die anzahl an keys ...
	{	Mod(A_Index,2)!=0 ? (key := A_LoopField, keys .= A_LoopField "`n")	; keep 'keynames' and concatenate them for sorting/erstelle unsortierte 'key'-liste
	:	Mod(A_Index,2) =0 ? (array[key] := A_LoopField)						; add 'key and item/value' to assoc. array/befüllung des array mit 'key+werte'-paaren
	:	""																	; ...
	}
Sort, keys																	; well, sorting the keys/sortierung der 'key'-liste
Loop, Parse, keys, `n														; parse for the number of sorted keys/für die anzahl an keys ...
	newContent .= A_LoopField "`n" array[A_LoopField] "`n"					; concatenate the sorted content/erstelle sortierte 'key'-liste
MsgBox % newContent															; ShowTime/Anzeige
Return

Re: Ahnunglosigkeit ...

Posted: 11 Jul 2020, 04:17
by haichen
Hi BoBo,
das Array ist schon so sortiert, wie du es mit deinem sort, keys erhälst.
Das ist wohl die Standardsortierung des assoz. Arrays.
Aber wenn man eine andere Sortierung will, z.B. sort, keys, r , dann wird es interessant.

Re: Ahnunglosigkeit ...

Posted: 11 Jul 2020, 04:40
by Rohwedder
eine andere Sortierung?
Versuch mal:

Code: Select all

array := {aaa:"bbbbbbbbbb",ccc:"1234567890",​bbb:"xxxxxxx"}
For key, value in array
	MsgBox %key% = %value%

Re: Ahnunglosigkeit ...

Posted: 11 Jul 2020, 04:46
by gregster
Beim Dictionary COM-Objekt kann man die Reihenfolge beibehalten, in der die Keys erstellt wurden: https://www.autohotkey.com/boards/viewtopic.php?f=6&t=77#p396

Re: Ahnunglosigkeit ...

Posted: 11 Jul 2020, 06:02
by haichen
Ich meine, dass man sich auch eine eigene .enum() basteln kann.
https://www.autohotkey.com/boards/viewtopic.php?f=7&t=7199
Ist aber für mich nicht verständlich..

Re: Ahnunglosigkeit ...

Posted: 11 Jul 2020, 08:35
by BoBo
haichen wrote:
11 Jul 2020, 04:17
Hi BoBo,
das Array ist schon so sortiert, wie du es mit deinem sort, keys erhälst.
Das ist wohl die Standardsortierung des assoz. Arrays.
Aber wenn man eine andere Sortierung will, z.B. sort, keys, r , dann wird es interessant.
Das habe ich im nachhinein auch just-me's statement entnommen ...
"In AHK 1.1 werden sowohl numerische als auch nicht numerische Schlüssel immer automatisch aufsteigend sortiert"
Als laie wundert man/frau sich. Da pustet man werte unsortiert ins array. Denkt die liegen dann dort in genau dieser (un)sortierung.
Darauf fängt man/frau an umständlichste sortiermethoden zu verbuxeln. Und am ende reicht mal wieder der in der AHK-hilfe überlesene einzeiler.
Menno :?

Re: Ahnunglosigkeit ...

Posted: 11 Jul 2020, 10:57
by Rohwedder
@BoBo
Und was passiert hier?

Code: Select all

vorwärts := {​​aaa:"bbbbbbbbbb",​bbb:"xxxxxxx",ccc:"1234567890"}
For key, value in vorwärts
	rückwärts .= key "`t" value "`n"
MsgBox,, rückwärts,% rückwärts
Das Leben wird vorwärts gelebt und rückwärts verstanden.

Re: Ahnunglosigkeit ...

Posted: 11 Jul 2020, 14:58
by Frosti
Hey, Bobo Deine Ahnungslosigkeit hat ein massives Interesse erzeugt! 5902 mal wurde dieser Thread in etwas über 24h aufgerufen. Ich wäre der erste mit einer Antwort gewesen, habe es aber lieber gelassen.

Re: Ahnunglosigkeit ...

Posted: 12 Jul 2020, 01:11
by BoBo
@Frosti Mit ner Bild-Zeitung-Überschrift ist der Leserpool eben gleich viel größer als mit einer fürs :arrow: Spektrum der Wissenschaft :mrgreen:
Und dann gibts da ja auch noch den Dunning-Kruger-Effekt :lol: ...

Re: Ahnunglosigkeit ...

Posted: 12 Jul 2020, 02:52
by haichen
Hi Rohwedder,
hab das erst jetzt richtig gelesen. Tatsächlich wird das array rückwärts ausgegeben. Aber dann so etwas:

Code: Select all


vorwaerts := {​​aaa:"bbbbbbbbbb",​bbb:"xxxxxxx",ccc:"c1234567890"}
For key, value in vorwaerts
	rueckwaerts .= key "=" value "`n"

MsgBox,, rueckwaerts,% "For-loop:`n" rueckwaerts "`nEinzelwerte:`nvorwaerts[aaa]: " vorwaerts[aaa] "`nvorwaerts[''aaa'']: " vorwaerts["aaa"] "`nvorwaerts.aaa: " vorwaerts.aaa "`n`nvorwaerts[bbb]: " vorwaerts[bbb] "`nvorwaerts[''bbb'']: " vorwaerts["bbb"] "`nvorwaerts.bbb: " vorwaerts.bbb "`n`nvorwaerts[ccc]: " vorwaerts[ccc] "`nvorwaerts[''ccc'']: " vorwaerts["ccc"] "`nvorwaerts.ccc: " vorwaerts.ccc 
/*
For-loop:
ccc=c1234567890
?bbb=xxxxxxx
??aaa=bbbbbbbbbb

Einzelwerte:
vorwaerts[aaa]: 
vorwaerts[''aaa'']: 
vorwaerts.aaa: 

vorwaerts[bbb]: 
vorwaerts[''bbb'']: 
vorwaerts.bbb: 

vorwaerts[ccc]: 
vorwaerts[''ccc'']: c1234567890
vorwaerts.ccc: c1234567890
*/

array := {"aaa":"bbbbbbbbbb","ccc":"1234567890","bbb":"xxxxxxx"}
MsgBox, % "`nEinzelwerte:`narray[aaa]: " array[aaa] "`narray[''aaa'']: " array["aaa"] "`narray.aaa: " array.aaa "`n`narray[bbb]: " array[bbb] "`narray[''bbb'']: " array["bbb"] "`narray.bbb: " array.bbb "`n`narray[ccc]: " array[ccc] "`narray[''ccc'']: " array["ccc"] "`narray.ccc: " array.ccc 

/* alles wie erwartet
Einzelwerte:
array[aaa]: 
array[''aaa'']: bbbbbbbbbb
array.aaa: bbbbbbbbbb

array[bbb]: 
array[''bbb'']: xxxxxxx
array.bbb: xxxxxxx

array[ccc]: 
array[''ccc'']: 1234567890
array.ccc: 1234567890
*/
Sehe ich da einen Fehler in Autohotkey oder habe ich etwas übersehen.
Die Hilfe sagt: "Bei der {Key:Value}-Schreibweise muss der Key, sofern dieser nur aus Wortzeichen besteht, nicht in Anführungszeichen gesetzt werden. " Von daher eigentlich alles richtig. Oder?

Re: Ahnunglosigkeit ...

Posted: 12 Jul 2020, 03:07
by Rohwedder
Es ist alles richtig und Autohotkey keinen Fehler. In meinem Kode ist nur etwas versteckt.

Re: Ahnunglosigkeit ...

Posted: 12 Jul 2020, 03:26
by haichen
Ich habs gefunden: Irgendein unsichtbares Zeichen vor dem aaa und bbb. Da hast du mich aber ganz schön geärgert.

Re: Ahnunglosigkeit ...

Posted: 12 Jul 2020, 03:29
by just me
Ja: Unsichtbare Zeichen.

Ich nenne das 'Irreführung', weil rückwärts tatsächlich vorwärts entspricht.

Nichts für Ungut! ;)