Come posso trovare l'intersezione di due elenchi in AppleScript?

5

Diciamo che ho due elenchi in AppleScript:

set listA to {"red", "green", "blue"}
set listB to {"green", "blue"}

Vorrei creare un terzo elenco contenente solo gli elementi presenti in entrambi gli elenchi :

set listC to intersection of listA and listB --something like this
-- would return {"green", "blue"}

In sostanza, qualcosa come PHP array_intersect () .

C'è un modo integrato per farlo?
In caso contrario, mi piacerebbe una raccomandazione per un'aggiunta di script che risolva questo problema.

    
posta Nathan Greenstein 17.08.2011 - 02:44
fonte

1 risposta

5

Il Elenco & Strumenti di registrazione L'aggiunta di script fornisce intersection of listA and listB (tra gli altri bit di terminologia).

Non esiste una "primitiva" built-in per calcolare un'intersezione di lista. Di solito si userebbe uno o più loop per controllare ogni elemento di una lista contro l'altro. Questo può essere semplificato (e velocizzato 1 ) un po 'usando uno degli operatori is in / is contained by / contains (o una sua negazione):

set listA to {"red", "green", "blue"}
set listB to {"green", "blue"}

to intersection of listA against listB
    local newList, a
    set newList to {}
    repeat with a in listA
        set a to contents of a -- dereference implicit loop reference
        if {a} is in listB then set end of newList to a
    end repeat
    newList
end intersection

intersection of listA against listB --> {"green", "blue"}

1 L'operatore is in ei suoi parenti sono implementati dall'ambiente di runtime AppleScript nel codice di livello inferiore dove vengono eseguiti molto più velocemente rispetto al normale codice AppleScript interpretato.

Per inciso, i gestori che utilizzano parametri etichettati hanno un insieme limitato di termini che possono essere utilizzati per le etichette. Ad esempio, intersection of listA and listB non è possibile come gestore definito dall'utente poiché and non è un'etichetta riconosciuta. Vedi Guida della lingua AppleScript sezione gestori con parametri etichettati per un elenco di etichette valide. Le estensioni di applicazioni e OSA possono definire le proprie terminologie (ad esempio, l'elenco e Record OSAX fornisce questa sintassi esatta), ma i gestori definiti dall'utente non sono così flessibili. Di solito uso solo i parametri posizionali ( handlerName(param1, param2, …) ) invece di provare a fare in modo che le invocazioni dei miei gestori assomiglino alla prosa.

    
risposta data 17.08.2011 - 04:12
fonte

Leggi altre domande sui tag