第三章:数组操作
1. 编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间
- java风格
def randomArray(n:Int)={
val a = new Array[Int](n)
for(i <- 0 until a.length){
a(i) = new Random().nextInt(n)
}
a
}
- scala风格
def randomArray(n:Int)={
(for(i <- 0 until n ) yield new Random().nextInt(n)).toArray
}
2. 编写一个循环,将整数数组中相邻的元素置换。例如,Array(1,2,3,4,5)经过置换后变为Array(2,1,4,3,5)
//2.交换相邻位置的元素
def exchange(arr : Array[Int])={
for(i <- 0 until (arr.length-1,2)) {
val temp = arr(i)
arr(i) = arr(i+1)
arr(i+1) = temp
}
arr
}
这题有人说先转成ArrayBuffer,再调用remove
和insert
这2个API完成,但是数组中间进行删除和插入效率并不高,不如直接索引找到值,进行修改。当然最爽的做法是直接arr
。当然这个题最好的做法就是用函数arr.grouped(2).reverse
3. 重复前一个练习,不过这一次生成一个新的值交换过的数组。用for/yield
- 第一种最开始想到的
def exchangeWithNewArray(arr:Array[Int])={
(for(i <- 0 until arr.length) yield {
if(i%2 != 0){
arr(i-1)
}else{
if(i+1 ==arr.length){
arr(i)
}else {
arr(i + 1)
}
}
}).toArray
}
- 后来想到的
def exchangeWithNewArray2(arr:Array[Int])={
(for(i<-0 until arr.length by 2; j<- i+1 to i by -1 if j<arr.length) yield arr(j)).toArray
}
4. 给定一个整数数组,产生一个新的数组,包含元数组中的所有正值,以原有顺序排列,之后的元素是所有零或负值,以原有顺序排列
随机数组,我们之前已经做过了,这里就不在做了,我们直接看下怎么排序
def randomSortedArray(arr:Array[Int])={
Array.concat(arr.filter(_>0),arr.filter(_<=0))
}
5. 如何计算Array[Double]的平均值?
def aveArray(arr:Array[Double]):Double={
arr.sum/arr.length
}
6. 如何重新组织Array[Int]的元素将他们以反序排列?对于ArrayBuffer[Int]你又会怎么做呢?
def reverseArray(arr:Array[Int]):Array[Int]={
arr.reverse
}
ArrayBuffer也可以同样处理
7.编写一段代码,产出数组中的所有值,去掉重复项。
def distinctArray(arr:Array[Int]):Array[Int]={
arr.distinct
}
9. 创建一个由java.util.TimeZone.getAvailableIDs返回ide时区集合,判断条件是它们在美洲。去掉”America/”前缀并排序
直接for...if..yield