3

不変のリストがあり、その中の場所を交換する必要があります。それを行う簡単な方法はありますか?

以下は私のコードです:

def swap(i:Int, j:Int,li:List[T]):List[T]={
        if(i>=li.size && j >=li.size)
            throw new Error("invalie argument");

        val f = li(i)
        li(i) = li(j) //wont work
        li(j) = f;//wont work
        li;
    }

最初は、配列に変換し、位置を変更してから、再度リストに変換してみました。簡単な方法はありますか?

4

4 に答える 4

15

これを行う簡単な(しかしあまり効率的ではない方法)

val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

l.updated(0,l(2)).updated(2,l(0))
res1: List[Int] = List(3, 2, 1)
于 2012-12-09T10:20:39.217 に答える
5

でのみ新しいリストを作成できますO(n)。別のデータ構造を使用したい場合があります。次の方法でこれを行うことができます。

def swap[T](i:Int, j:Int,li:List[T]):List[T]={
    if(i>=li.size || j >=li.size || i >= j)
         throw new Error("invalid argument")

    li.dropRight(li.length - i) ::: (li(j) :: li.dropRight(li.length - j).drop(i+1)) ::: ((li(i) :: li.drop(j + 1)))
}

あまりエレガントではありませんが、仕事はします。基本的に、私はインデックスi&でリストをスライスしてjいるので、5 つの部分があります: の前のリストのプレフィックス、 、i&のi間の部分、および の後のリストのサフィックス。そこからは& swapd を使った単純な連結です。リストバッファを使用するとより効率的になり、変更可能なsで作業する場合はさらに効率的になります...ijjjijArray

于 2012-12-09T10:07:00.423 に答える
0

これでいいのかわかりませんが、こんな感じでいかがでしょうか?

def swapElements(list: List[Any], first: Int, second: Int) = {
 def elementForIndex(index: Int, element: Any) = {
   if(index == first) {
     list(second)
   } else if(index == second){
     list(first)
   } else {
     element
   }
 }

 for(element <- ((0 to list.size - 1) zip list).to[List])
   yield elementForIndex(element._1, element._2)
}
于 2015-03-24T21:53:54.853 に答える