Sto cercando di unire due mappe, ma non esiste un metodo integrato per unire le raccolte. Quindi come lo fai?in F #, come si uniscono due istanze Collections.Map?
risposta
Definire la seguente funzione:
let join (p:Map<'a,'b>) (q:Map<'a,'b>) =
Map(Seq.concat [ (Map.toSeq p) ; (Map.toSeq q) ])
esempio:
let a = Map([1,11;2,21;3,31;])
let b = Map([3,32; 4,41;5,51;6,61;])
let c = join a b
e il risultato:
val c : Map<int,int> =
map [(1, 11); (2, 21); (3, 32); (4, 41); (5, 51); (6, 61)]
Grazie! Questo funziona. – klactose
Attenzione, questo ricostruisce da zero sia le mappe che possono essere molto lente. Una soluzione migliore è quella di Robert se 'map1' è grande e' map2' è piccolo. –
È possibile implementare questo utilizzando Map.fold e Map.add, dato aggiuntivo è in realtà aggiungere/sostituire:
let map1 = Map.ofList [ 1, "one"; 2, "two"; 3, "three" ]
let map2 = Map.ofList [ 2, "two"; 3, "oranges"; 4, "four" ]
let newMap = Map.fold (fun acc key value -> Map.add key value acc) map1 map2
printfn "%A" newMap
Probabilmente il motivo di unione non è prevista fuori dalla scatola è che è necessario affrontare con conflitti chiave. In questo semplice algoritmo di fusione, prendiamo semplicemente la coppia di valori chiave dalla seconda mappa, questo potrebbe non essere il comportamento che vuoi.
In effetti questo è esattamente il modo in cui ho implementato questo: – Massif
Un modo alternativo è questo:
let merge (a : Map<'a, 'b>) (b : Map<'a, 'b>) (f : 'a -> 'b * 'b -> 'b) =
Map.fold (fun s k v ->
match Map.tryFind k s with
| Some v' -> Map.add k (f k (v, v')) s
| None -> Map.add k v s) a b
Consente di decidere il valore desiderato se sono presenti chiavi duplicate.
Esempio:
let a = Map([1,11;2,21;3,31;])
let b = Map([3,32; 4,41;5,51;6,61;])
merge a b (fun k (v, v') -> v + v');;
//Result
val it : Map<int,int> =
map [(1, 11); (2, 21); (3, 63); (4, 41); (5, 51); (6, 61)]
Si noti che la chiave 3
è diverso.
Nota: non è effettivamente necessario specificare i tipi sui parametri di input. – Benjol
- 1. R: come si uniscono/combinano due ambienti?
- 2. Come si uniscono le tabelle da due diverse istanze di SQL Server nella query uno SQL
- 3. Come si uniscono due flussi di input in Java?
- 4. Come si uniscono due tabelle senza nominare tutte le colonne?
- 5. Come si uniscono due diverse soluzioni di Visual Studio?
- 6. Come si uniscono due file avi usando ffmpeg?
- 7. elenco di oggetti da Collections.map
- 8. Come si uniscono due rami git che si trovano in diversi repository/cartelle locali?
- 9. Panda si uniscono senza sostituzione
- 10. Come si uniscono più file PDB?
- 11. SVN diversi alberi che si uniscono
- 12. Come si uniscono gli elementi ripetuti consecutivi in un array?
- 13. Swift: come combinare due istanze di dizionario?
- 14. Apre due rami GIT in due istanze IDE separate?
- 15. Come avere più condizioni in JPQL uniscono
- 16. Come si uniscono due tabelle usando Django senza usare raw sql?
- 17. Come si uniscono due tabelle su un campo chiave esterna usando django ORM?
- 18. Come si uniscono due datafram di Pandas con diversi livelli di indice delle colonne?
- 19. Spark colonne duplicate in dataframe dopo si uniscono
- 20. interno si uniscono con il simile clausola
- 21. Come si uniscono le tabelle con le chiavi principali autonome?
- 22. Sommando due istanze boost :: accumulator_set
- 23. Due stringhe identiche possono essere due istanze separate in C#?
- 24. Hazelcast: Unire due istanze Hazelcast
- 25. Come si inverte una matrice in F #?
- 26. Come si fa un applicativo in F #?
- 27. Come utilizzare JPA Criteri API quando si uniscono molte tabelle
- 28. I panda uniscono due dataframes con colonne diverse
- 29. sinistra si uniscono per ottenere una singola riga in laravel
- 30. La parte del percorso viene sovrascritta quando si uniscono due URI
si dovrebbe guardare qui (http://stackoverflow.com/questions/590991/merging-two-ienumerablets), in pratica map1.Union (map2) dovrebbe funzionare – dvhh
Debole cavillo: utilizzando l'operatore Union di linq si finirebbe con un IEnumerable di tuple, non proprio la stessa di una mappa. – Robert