Emulazione di array associativi in AppleScript

4

Un problema che sarebbe banale da risolvere con coppie chiave = > valore. Per ogni articolo in list_a, trova l'elemento corrispondente in list_b e confronta un singolo attributo (calcola il rapporto di scala per due serie di immagini).

Gli elenchi di AppleScript hanno un aspetto simile al seguente:

listA = {{filename:"filename X.tif",width:"500"},{filename:"filename Z.tif",width:"200"}, ...}
listB = {{filename:"filename Z.tif",width:"400"},{filename:"filename v.tif",width:"222"}, ...}

Entrambi gli elenchi possono contenere un numero diverso di articoli / ordine, rendendo impossibile il relay su nth item of list per la selezione delle coppie

Mentre sarebbe possibile iterare su ogni oggetto in listA e confrontare la sua proprietà filename con ogni oggetto di listB, questo è orribilmente inefficiente, anche con poche centinaia di elementi.

È possibile risolvere questo problema utilizzando AppleScript oppure è necessario serializzare gli oggetti e passare l'attività di valutazione a uno script esterno che supporta assoc. array?

    
posta cjoy 15.08.2013 - 15:24
fonte

3 risposte

2

Anche se AppleScript ha array associativi, sono chiamati "record". Ho provato a utilizzare i record AppleScript per darti una soluzione. Nel codice sottostante, non ero in grado di usare una stringa come chiave. Sono riuscito a utilizzare qualcosa che assomiglia a un nome di file, un identificatore, ma questo non funziona davvero. È un'idea di come usare un array associato in AppleScript:

set theAssociativeArray to {|file name 3.jpg|:{width:400}, |file name 1.jpg|:{width:222}}

-- looking things up by key in an AppleScript record, which is really a dictionary, is fast
try
    get |file name3.jpg| of theAssociativeArray
    say "file name 3 is on list"
on error
    say "file name 3 is not on list"
end try
try
    get |file name 1.jpg| of theAssociativeArray
    say "file name 1 is on list"
on error
    say "file name 1 is not on list"
end try

Ho visto che nel tuo codice di esempio hai definito elenchi di record. Quello che ho cercato di fare è definire i record dei record.

Penso che la cosa principale da tenere a mente sui punti di forza e di debolezza di AppleScript sia che si tratta di un linguaggio progettato per Interapplication Communication (IAC), che gira attorno al comando tell per dire a diverse app di ottenere dati, impostare dati e per controllare le app dicendo loro i comandi.

Ecco un collegamento a una risposta che ritengo sia pertinente per una soluzione AppleScript:

Alla ricerca dell'intersezione di due liste

La soluzione definitiva che utilizza AppleScript potrebbe essere l'utilizzo di AppleScriptObjC che consente di utilizzare classi Objective-C come NSDictionary che assomigliano molto agli array associativi.

    
risposta data 16.08.2013 - 11:04
fonte
3

Se puoi usare uno script di shell (o do shell script ), awk supporta gli array associativi con chiavi stringa e ricerca rapida.

$ cat widths.txt
2.tif 600
1.tif 500
4.tif 700
$ cat heights.txt
4.tif 1000
2.tif 900
$ awk 'NR==FNR{a[$1]=$2;next}{print $1" "a[$1]/$2}' widths.txt heights.txt
2.tif 0.666667
4.tif 0.7
    
risposta data 16.08.2013 - 11:50
fonte
0

In realtà, è possibile che il tuo primo script scriva un secondo script ed esegua il secondo script "all'interno dell'altro", consentendo così di scrivere le chiavi "al volo". Ecco una demo divertente che gioca con il concetto. Spero che aiuti!

--WRITE KEYS TO 'ASOCIATIVE ARRAYS' on theFLY!!!! (a.k.a. applescript 'records') --THIS SCRIPT RANDOMLY GETS A KEY TO EXTRACT A VALUE FROM THE APPLESCRIPT RECORD --THE COOL PART IS THAT IT ALSO GENERATES THE NAME OF THE RECORD --AND THE NAME OF THE LAST KEY IN THE RECORD!!!!!!!!! set USE_ANY_NAME_YOU_LIKE to "double_Oh_7" --try 'MonkeyPenny' or 'Q' or 'double_Oh_7' set RANDUMB_VARIABLE to some item of {"JaymsBond", "secret_Messij", USE_ANY_NAME_YOU_LIKE} set EMBEDEDSCRIPT to " on run(xxx) beep 3 say \"I'm accessing the associative arrays,\" &xxx &\"key.\" return " & RANDUMB_VARIABLE & " of {JaymsBond:007, secret_Messij:\"shaken not stirred\"," & RANDUMB_VARIABLE & ":\"yep\"} end" set z to run script EMBEDEDSCRIPT with parameters {RANDUMB_VARIABLE} return "The value of the " & RANDUMB_VARIABLE & " key is ... " & z

- risultato 1 > > > "Il valore della chiave double_Oh_7 è ... sì" --result 2 > > > "Il valore della chiave JaymsBond è ... 7" --result 3 > > > "Il valore della chiave secret_Messij è ... shaken not stirred"

    
risposta data 25.04.2016 - 21:52
fonte

Leggi altre domande sui tag