'daki koleksiyonların tahsihi koleksiyonlarını aktarma Sıklıkla Scala'da bir "dikdörtgen" koleksiyon koleksiyonunu transpoze etmek zorundayım, örneğin: bir harita listesi, bir harita listesi, bir harita haritası, bir dizi liste , kümeler haritası vb. Koleksiyonlar, belirli bir alandan bir ortak alan adına eşleme olarak eş dağılımlı olarak görülebildiğinden (örneğin: Bir Liste [A]/Array [A], İnt etki alanından A co- etki alanı, [A] ayarı A etki alanından Boole etki alanlarına eşleme, vb.), bir dönüşüm işlemi yapmak için temiz, genel bir işlev yazmak istiyorum (örneğin: bir aktarma listesine bir liste döndürün) haritalar listesi). Ancak, sorun yaşıyorum çünkü() operatörünün dışındaki Scala, koleksiyonları soyut olarak eşleme olarak görmek için birleşik bir API'ye sahip değil gibi görünüyor.Scala
def transposeMapOfLists[A,B](mapOfLists: Map[A,List[B]]) : List[Map[A,B]] = {
val k = (mapOfLists keys) toList
val l = (k map { mapOfLists(_) }) transpose;
l map { v => (k zip v) toMap }
}
def transposeListOfMaps[A,B](listOfMaps: List[Map[A,B]]) : Map[A,List[B]] = {
val k = (listOfMaps(0) keys) toList
val l = (listOfMaps map { m => k map { m(_) } }) transpose;
(k zip l) toMap
}
def transposeMapOfMaps[A,B,C](mapOfMaps: Map[A,Map[B,C]]) : Map[B,Map[A,C]] = {
val k = (mapOfMaps keys) toList
val listOfMaps = k map { mapOfMaps(_) }
val mapOfLists = transposeListOfMaps(listOfMaps)
mapOfLists map { p => (p._1, (k zip p._2) toMap) }
}
biri bana devrik bir jenerik toplama-of-the koleksiyonları içine bu yöntemleri birleştirmeye yardımcı olabilir:
Yani şöyle koleksiyonu-of-the koleksiyonları her türü için ayrı devrik yazmaya son? Ayrıca bana yardımcı olacak (ve eminim diğerleri) bu süreçte bazı yararlı Scala özelliklerini öğrenecekler.
ps: Özel durum işleyişini görmezden geldim ve koleksiyonların koleksiyon koleksiyonunun dikdörtgen olduğunu varsayalım, yani tüm iç koleksiyonların etki alanı öğeleri aynı kümeyi oluşturuyor.
Teşekkürler - bu çok yararlı! Ne yaptığınızı anlamak için epey zamanımı aldı çünkü kullandığınız Scala'nın bazı gelişmiş özelliklerine aşina değilim (bu özellikleri şimdi daha ayrıntılı olarak öğrenmek benim için büyük bir bahane!). – Ashwin