2016-03-31 14 views
3
Ben bir döngü kullanarak birkaç listeyi bitiştirmek nasıl bilmek istiyorum

. İşte yapmak istediğim şey bir örnektir:Concatenate birden fazla liste

object MyObj { 
    var objs = Set (
    MyObj("MyObj1", anotherObjList), 
    MyObj("MyObj2", anotherObjList) 
) 

    val list = List.empty[AnotherObj] 
    def findAll = for (obj <- objs) List.concat(list, obj.anotherObjList) 
} 

ben set OBJS ait nesneden listelerini bitiştirmek için fonksiyon findall istiyorum.

objs.flatMap(_.anotherObjList) 

Bir for kullanmaz, ama muhtemelen Scala bunu yapmak için en özlü ve okunabilir bir şekilde açıklanmıştır:

cevap

5

bu deneyin.

1

kullanın böyle reduce

şey:

objs.reduce((a,b) => a.anotherObjList ++ b.anotherObjList) 

Ya Set boş olabilir eğer kullanmak foldLeft: kodunuzu örneğinde

objs.foldLeft(List.empty[AnotherObj],(a,b) => a.anotherObjList ++ b.anotherObjList) 
+0

bu derleme yapmaz. Bir ' –

+0

Neden' ​​a' bir Liste olacağını MyObj' 'a' bir' list 'değil mi? 'Objs' MyObjs's 'bir' Set' olup. –

+0

Ben çalışma değildi, azaltmak yolu denemişti. Hata, tür uyuşmazlığıdır; Bulunan: Liste [AnotherObj], gerekli MyObj – jerome

1

, bir vallist kullanıyor yeniden atanamaz. Eğer List.concat(list, obj.anotherObjList) yaptığınızda geçerli obj 'ın anotherObjList boş list concats yeni bir liste oluşturarak, ancak sonuç yüzden list hala yürütülmesi sonra boş olacaktır, hiçbir zaman kullanılmaz For döngüsü.

object MyObj { 
    var objs = Set(
    MyObj("MyObj1", anotherObjList), 
    MyObj("MyObj1", anotherObjList), 
) 

    def findAllLoop1 = { 
    var list = List.empty 
    for (obj <- objs) list = list ++ obj.anotherObjList 
    list 
    } 

    def findAllLoop2 = { 
    val buf = collection.mutable.ListBuffer[Int]() // replace Int with your actual type of elements 
    for (obj <- objs) buf ++= obj.anotherObjList 
    } 
} 

:

gerçekten For döngüsü bir zorunluluk kullanmak, ya bir iletmenin koleksiyon kullanmak ve for-döngünün vücudundan yeniden atanabilir bir var atamak veya değişken koleksiyon kullanmanız gerekiyorsa

Ancak, herhangi bir nedenden ötürü bir zorunlu döngü kullanmak zorunda kalmazsanız, işlevsel bir alternatif kullanmayı şiddetle öneririm: