1

我正在尝试将代码从 Java 转换为 Scala:

class Item {
  public long lng;
  public String str;

  Item(long lng, String str) {
   this.lng = lng;
   this.str = str;
  }
}

Item[] items = getItems(...) //doesn't really matter
int maxCount = getMaxCount()
for(int i = 0; i < maxCount && i < items.length; ++i) {
    System.out.println(String.format("%d %s",items[i].lng, items[i].str));
}

这是我的尝试:

class Item (val lng: Long, val str: String)
val items = Array(new Item(1, "11"), new Item(2, "22"))
val maxCount = getMaxCount
for {
      x <- items
      i <- 0 to maxCount
      if i < maxCount
  } println(x.lng.toString + " " + x.str)

for {...}另外,如果不使用filterWithandforeach 使用,怎么能做到这一点var

它打印字符串maxCount*2时间。

4

2 回答 2

5

您需要将您的值声明为类成员;正如您定义的那样,它们是构造函数参数。为它们加上前缀val,使它们也成为类成员:

class Item(val lng: Long, val str: String)

此外,在最后一行中,错误指示s并且l不是x. 他们的名字是strlng

i据我所知,你根本不需要。

val maxCount: Int = ...
items.take(maxCount).foreach { x => println(s"${x.lng} ${x.str}") }
于 2013-10-03T03:24:40.243 回答
1

take按照WeaponsGrade的建议使用是一个不错的解决方案,但如果您确实需要与索引相关的内容,则对您没有帮助。一个直接的转换会是这样的:

for (i <- 0 until (maxCount max items.length)) {

或者,对于比简单的更复杂的条件max,你可以这样写:

for (i <- 0 until items.length if i < maxCount) {

这与 Java 的 for 循环不同 —— 完成 Java 所做的事情的唯一方法是使用递归或 while 循环。

现在,有另一种写法。首先,您可以为任何 Scala 集合0 until items.length编写, 而不是。items.indices

接下来,如果您同时想要项目及其索引,则可以使用以下命令:

for ((x, i) <- items.zipWithIndex if i < maxCount) {

使用filterWith,你可以这样写:

items.indices.filterWith(i => i < maxCount).foreach { i => 
  println(s"${items(i).lng} ${items(i).str}")
}

或者几乎任何其他选择。例如,zipWithIndex版本变为:

items.zipWithIndex.filterWith { 
  case (x, i) => i < maxCount 
}.foreach {
  case (x, i) => println(s"${x.lng} ${x.str}")
}
于 2013-10-03T04:16:36.250 回答