我正在尝试使用for和yield交换我的数组中的每对值,到目前为止,我非常不成功。我试过的内容如下:
val a = Array(1,2,3,4,5) //What I want is Array(2,1,4,3,5)
for(i<-0 until (a.length-1,2),r<- Array(i+1,i)) yield r
上面给出的片段返回向量2,1,4,3(省略了5)
有人可以指出我在这里做错了什么以及如何使用for和yield获得正确的逆转?
由于
答案 0 :(得分:39)
a.grouped(2).flatMap(_.reverse).toArray
或者如果你需要/ yield(在这种情况下更简洁,实际上扩展为相同的代码):
(for {b <- a.grouped(2); c <- b.reverse} yield c).toArray
答案 1 :(得分:13)
如果你不使用for/yield
:
a.grouped(2)
.flatMap{
case Array(x,y) => Array(y,x)
case Array(x) => Array(x)
}.toArray // Array(2, 1, 4, 3, 5)
答案 2 :(得分:9)
我不知道OP是否正在阅读 Scala for the Impatient ,但这是练习3.3。
我喜欢地图解决方案,但我们还没有在那一章,所以这是我使用/ yield所需的丑陋实现。您可以将一些良率逻辑移动到一个保护/定义中。
for( i <- 0 until(a.length,2); j <- (i+1).to(i,-1) if(j<a.length) ) yield a(j)
我是一个Java人,所以我没有确认这个断言,但我很好奇地图/分组和迭代器的开销是多少。我怀疑这一切都编译成相同的Java字节代码。
答案 3 :(得分:0)
另一种简单的收益解决方案:
def swapAdjacent(array: ArrayBuffer[Int]) = {
for (i <- 0 until array.length) yield (
if (i % 2 == 0)
if (i == array.length - 1) array(i) else array(i + 1)
else array(i - 1)
)
}
答案 4 :(得分:0)
这是我的解决方案
def swapAdjacent(a: Array[Int]):Array[Int] =
(for(i <- 0 until a.length) yield
if (i%2==0 && (i+1)==a.length) a(i) //last element for odd length
else if (i%2==0) a(i+1)
else a(i-1)
).toArray
答案 5 :(得分:0)
如果你在Scala中为不耐烦做练习3.2和3.3,这里都是我的答案。它们与移动的逻辑相同。
/** Excercise 3.2 */
for (i <- 0 until a.length if i % 2 == 1) {val t = a(i); a(i) = a(i-1); a(i-1) = t }
/** Excercise 3.3 */
for (i <- 0 until a.length) yield { if (i % 2 == 1) a(i-1) else if (i+1 <= a.length-1) a(i+1) else a(i) }
答案 6 :(得分:0)
for (i <- 0 until arr.length-1 by 2) { val tmp = arr(i); arr(i) = arr(i+1); arr(i+1) = tmp }
我最近开始学习Scala,我的github上提供了 Scala for the Impatient (第1版)中的所有解决方案:
第2章 https://gist.github.com/carloscaldas/51c01ccad9d86da8d96f1f40f7fecba7
第3章 https://gist.github.com/carloscaldas/3361321306faf82e76c967559b5cea33
答案 7 :(得分:0)
我有我的解决方案,但没有收益。也许有人会发现它很有用。
def swap(x: Array[Int]): Array[Int] = {
for (i <- 0 until x.length-1 by 2){
var left = x(i)
x(i) = x(i+1)
x(i+1) = left
}
x
}
答案 8 :(得分:0)
假设数组不为空,那么你去:
val swapResult = for (ind <- arr1.indices) yield {
if (ind % 2 != 0) arr1(ind - 1)
else if (arr1(ind) == arr1.last) arr1(ind)
else if (ind % 2 == 0) arr1(ind + 1)
}