2017-04-14 56 views
1

的減指數對於一個實際的練習,我需要定義,基本上每變化值的指數在奇數索引列表的功能,這樣我就得到這樣的:斯卡拉:奇數值

changePairs(List(1,2,3,4,5,6,7,8,9,10,11)) 
//> res62: List[Int] = List(2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 11) 

changePairs(List(2,2,30,4,50,6,7,80,9,100)) 
//> res63: List[Int] = List(2, 2, 4, 30, 6, 50, 80, 7, 100, 9) 

所以基本上我需要交換每個奇偶對的位置,並且如果我在最後一個索引處留下了一個奇數元素(第一個示例中爲11),我將它保留原樣。

我有這個,但它絕對不工作,我不知道爲什麼。

def changePairs(a: List[Int]) = a.zipWithIndex.map { 
case (s,i) => if (i % 2 != 0) a.patch(i,Seq(s),1); a.patch(i-2,Seq(s),0); 
} 
+0

目前尚不清楚你想要做什麼。如果你想改變奇數值的索引,爲什麼在第二個例子中移動了'4'和'6'? –

+0

我不明白你的邏輯。你的第二個例子只有兩個奇數值(7和9),但比這兩個值改變了很多。 –

+0

'a.grouped(2).map(_。reverse).flatten.toList'這個問題在前幾天被問過,但是找不到。 – Psidom

回答

0

這裏有一種方法:

,讓你去是,一旦你覺得分組名單分爲兩個元素,這是 grouped(2)做的子表
def changePairs(a: List[Int]) = a.grouped(2).flatMap { 
    case List(a, b) => List(b, a) 
    case a => a 
}.toList 

changePairs(List(1, 2, 3, 4, 5, 6, 7)) // List(2, 1, 4, 3, 6, 5, 7) 

主要思想。從那以後,這是一個簡單的過程 - 描述兩個案例,一個包含兩個元素(在這種情況下,我們將其翻轉),另一個只包含一個元素,例如我的例子中的7個元素,在這種情況下,我們只保留它。我們使用flatMap將得到的2元素列表的列表放到一個大列表中,我們做.toList退出我們從grouped得到的迭代器。

編輯:

我現在在評論中看到a.grouped(2).map(_.reverse).flatten.toList。是的,這也同樣適用於此,但由於不是「手動」交換元素,我們只是在每個子列表上執行reverse,這與此相同。

+0

使用兩個答案中最好的:'a.grouped(2).flatMap(_。reverse).toList'。當你玩[代碼高爾夫](https://en.wikipedia.org/wiki/Code_golf)時,每一筆都算。 – jwvh

+0

謝謝,這工作! – Edhelvar

0

你也可以使用遞歸和模式匹配。這是有效的,因爲你只是通過列表一次:

def changePairs(l: List[Int]): List[Int] = { 
    l match { 
    case a :: b :: tail => b :: a :: changePairs(tail) 
    case _ => Nil 
    } 
}