4

我需要将一些 Java 代码转换为 Scala。我有这样的来源。如何在 Scala 中重写它?问题可能很简单。但它比文档中的 for(i <- 1 until 10) {} 示例更难匹配。

for (int i = password.length(); i != 0; i >>>=1)
  { some code }

国王问候,阿列克谢

4

4 回答 4

6

如果你希望它尽可能快——我假设这是给定 shift 操作的情况——那么你应该使用一个 while 循环:

var i = password.length()
while (i != 0) {
  // some code
  i >>>= 1
}

在相同的操作下,这是 Java 比 Scala 更紧凑的少数情况之一。

您还可以使用尾递归:

final def passwordStuff(password: Password)(i: Int = password.length): Whatever = {
  if (i != 0) {
    // Some code
    passwordStuff(password)(i >>> 1)
  }
}

这将编译成与 while 循环相同的速度(无论如何,几乎在所有情况下)。

于 2012-05-08T21:11:13.287 回答
2

如果您寻求异国情调的功能方式,您可以编写如下内容:

Stream.iterate(password.length)(i => i >>> 1).takeWhile(0!=)

它懒惰地执行以下操作:将密码长度作为初始值,应用于{ => i >>> 1 }它,将其传递给下一次迭代,应用......通过,......

然后我对计算进行了限定,将其限制为仅那些不等于 0 的值。

于 2012-05-08T23:27:15.053 回答
1

i >>>=1 等价i /= 2于正整数。

将这些知识与Incrementing the for loop (loop variable) in scala by 5的答案相结合,您应该进行设置。

于 2012-05-08T21:06:48.037 回答
0

不知道 >>>= 运算符。让我们尝试更实用一点,foreach 接受一个函数 A => Unit,在这种情况下 A 是 Int

def breakdownBy2(from:Int):List[Int] = if(from == 0) Nil else List(from) ++  breakdownBy2(from/2)
breakdownBy2(passoword.length).foreach(println(_))
于 2012-05-08T21:36:26.317 回答