我刚刚开始学习Scala。我想要通过循环添加数字,并想找出最小数字。所以,我做了这个
for(j<-0 until numberOfQuery){
val z = readLine.split(" ");
var from = Integer.parseInt(z(0));
var to = Integer.parseInt(z(1));
var i=from;
var getNumber = List[Int](to+1);
var counter = 0;
for(i <-from until to+1){
getNumber.apply(storeElemets(i));
System.out.println(storeElemets(i));
}
System.out.println(getNumber.min);
}对于输入10 20 30 40 11 22 33 44 15 5和0 5,最小数字将是10。但是,它返回java.lang.IndexOutOfBoundsException。所以,
1)在Scala中声明List的正确方法是什么? 2)我的错误是什么?什么是正确的数字加法?
发布于 2014-02-14 16:24:38
List是一个不可变的single linked list。
使用List[Int](i),您可以创建一个包含单个元素(i)的列表:
List(5)
//res0: List[Int] = List(5)实际上,您正在调用一个工厂方法List.apply。参见object List documentation。
您应该将Nil用作空列表:
var getNumber: List[Int] = Nil
// or
var getNumber = List.empty[Int]使用getNumber.apply(n) (或getNumber(n)),您可以尝试通过元素在列表中的索引来选择元素。参见List documentation。所以你让IndexOutOfBoundsException和n > getNumber.size在这里。
您可以使用::方法将元素添加到列表中,如下所示:
getNumber = storeElemets(i) :: getNumber
// with syntax sugar:
getNumber ::= storeElemets(i)请注意,List是不可变的--您只能创建一个新列表。
您可以使用from to to而不是from until to+1。方法to (和until)创建一个Range。您可以在任何scala集合(包括Range)上使用方法map,如下所示:
val getNumber = (from until to).map{i => storeElemets(i)}
// with for-comprehensions:
val getNumber =
for {
i <- from until to
} yield storeElemets(i)请注意,Range上的map创建的是IndexedSeq,而不是List。在本例中不需要List,但是如果需要List,可以使用toList方法将集合转换为List
val myList = getNumber.toList发布于 2014-02-14 16:27:30
List(10, 20, 30, 40, 11, 22, 33, 44, 15, 5)声明你的列表。您可以通过追加方法.toList append从任何集合中构建列表。List.fill(to+1)(0)用to+1 0填充列表。此外,忘记分号,使用val而不是var,这样可以确保不变性,这对于大型程序来说非常方便。
storeElemets是未定义的,但是如果它返回i,那么在第二次迭代中,索引对于单例列表getNumber来说太高了
如果输入如下,则为
0 5 10 20 30 40 11 22 33 44 155 a b
其中a和b是所考虑列表的下级索引和上级索引,则应执行以下操作:
val z = readLine.split(" ")
val from = z(0).toInt
val to = z(1).toInt
val getNumber = z.toList.drop(2).drop(from).take(to-from+1)
val sum = getNumber.sum // Equivalent to getNumber.foldLeft(0){ case (res, n) => res + n }
println(sum)
println(getNumber.min)发布于 2014-02-14 17:11:43
如果你真的想要,你可以使用构建器:
val b = List.newBuilder[Int] // creates a list builder
for(i <-from until to+1){
b += storeElemets(i) // stores an element
println(storeElemets(i))
}
b.result() // you need to call it to retrieve a collection from builder附注:没有必要(甚至在scala风格指南中也不推荐)在行尾使用;。此外,您可以在没有类定义的情况下调用println。
https://stackoverflow.com/questions/21773799
复制相似问题