首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Scala中添加列表中的数字(初学者)

如何在Scala中添加列表中的数字(初学者)
EN

Stack Overflow用户
提问于 2014-02-14 16:01:49
回答 6查看 214关注 0票数 0

我刚刚开始学习Scala。我想要通过循环添加数字,并想找出最小数字。所以,我做了这个

代码语言:javascript
运行
复制
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 50 5,最小数字将是10。但是,它返回java.lang.IndexOutOfBoundsException。所以,

1)在Scala中声明List的正确方法是什么? 2)我的错误是什么?什么是正确的数字加法?

EN

回答 6

Stack Overflow用户

发布于 2014-02-14 16:24:38

List是一个不可变的single linked list

使用List[Int](i),您可以创建一个包含单个元素(i)的列表:

代码语言:javascript
运行
复制
List(5)
//res0: List[Int] = List(5)

实际上,您正在调用一个工厂方法List.apply。参见object List documentation

您应该将Nil用作空列表:

代码语言:javascript
运行
复制
var getNumber: List[Int] = Nil
// or
var getNumber = List.empty[Int]

使用getNumber.apply(n) (或getNumber(n)),您可以尝试通过元素在列表中的索引来选择元素。参见List documentation。所以你让IndexOutOfBoundsExceptionn > getNumber.size在这里。

您可以使用::方法将元素添加到列表中,如下所示:

代码语言:javascript
运行
复制
getNumber = storeElemets(i) :: getNumber
// with syntax sugar:
getNumber ::= storeElemets(i)

请注意,List是不可变的--您只能创建一个新列表。

您可以使用from to to而不是from until to+1。方法to (和until)创建一个Range。您可以在任何scala集合(包括Range)上使用方法map,如下所示:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
val myList = getNumber.toList
票数 3
EN

Stack Overflow用户

发布于 2014-02-14 16:27:30

  1. 你可以用List(10, 20, 30, 40, 11, 22, 33, 44, 15, 5)声明你的列表。您可以通过追加方法.toList append从任何集合中构建列表。
  2. 您的第一个错误是您没有创建大小为to+1的列表,它只创建了一个具有单个元素to+1的列表。尝试使用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是所考虑列表的下级索引和上级索引,则应执行以下操作:

代码语言:javascript
运行
复制
  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)
票数 2
EN

Stack Overflow用户

发布于 2014-02-14 17:11:43

如果你真的想要,你可以使用构建器:

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21773799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档