To jest problem, który rozwiązałem, ale będąc całkowitym imperatywem Scala noob, czuję, że znalazłem coś zupełnie nie eleganckiego. Wszelkie pomysły na ulepszenia docenione.Scala wstaw do listy w określonych lokalizacjach
val l1 = 4 :: 1 :: 2 :: 3 :: 4 :: Nil // original list
val insert = List(88,99) // list I want to insert on certain places
// method that finds all indexes of a particular element in a particular list
def indexesOf(element:Any, inList:List[Any]) = {
var indexes = List[Int]()
for(i <- 0 until inList.length) {
if(inList(i) == element) indexes = indexes :+ i
}
indexes
}
var indexes = indexesOf(4, l1) // get indexes where 4 appears in the original list
println(indexes)
var result = List[Any]()
// iterate through indexes and insert in front
for(i <- 0 until indexes.length) {
var prev = if(i == 0) 0 else indexes(i-1)
result = result ::: l1.slice(prev, indexes(i)) ::: insert
}
result = result ::: l1.drop(indexes.last) // append the last bit from original list
println(result)
Myślałem, że bardziej eleganckie rozwiązanie można osiągnąć za pomocą czegoś takiego, ale to tylko czysta spekulacja.
var final:List[Any] = (0 /: indexes) {(final, i) => final ::: ins ::: l1.slice(i, indexes(i))
Dzieło sztuki;) Co oznacza pierwsze [A]? Co znaczy? – Murgh
Pierwsze "[A]" oznacza, że jest to metoda generyczna (działa na pewnym typie "A", późniejszy "A" odnosi się do tego samego). "_" oznacza "niezależnie od zmiennej"; jest to skrót do 'x => x == 4'. –
'xs.map (..). Flatten' może być zapisany jako' xs.flatMap (..) '. – Landei