随机化列表

时间:2011-02-26 03:25:22

标签: scala

我写了一个函数,从单词列表中随机选择一个单词。在这里我的代码。 但它不能选择一个单词而不能打印。请告诉我我的代码有什么问题。

def long(a: Int, b: Int): String = {
    var a = 5
    var b = 100
    for (i <- args(1)){
        if (i > a && i < b){
            val rand = new Random(System.currentTimeMillis())
            val random_index = rand.nextInt(new_sun .length)
            val result = new_sun(random_index)
            var guess = println("_ " * result.length)
            }
        else{
            println("You have to input the word with length of 5 < 100")
            }
        return i.toString
        }
}

3 个答案:

答案 0 :(得分:11)

这里出现了很多问题,以至于很难知道从哪里开始。一次拍摄一个片段:

def long

真的,方法名称难以置信糟糕

def long(a: Int, b: Int): String = {
  var a = 5
  var b = 100

您将ab作为参数,然后立即隐藏名称以创建变量。那些参数没用。

for (i <- args(1)){
    if (i > a && i < b){
        ...
        }
    else{
        ...
        }
    ...
    }

这不遵循任何已识别的范围嵌套模式,在块的左大括号之前留出空格也是一种好习惯。更糟糕的是,for块的右大括号对齐,看起来像else子句的右大括号。这是生成不可维护代码的有保证的方法。我是所谓的“一个真正的支架风格”的拥护者,你的代码格式如下:

for (i <- args(1)) {
    if (i > a && i < b) {
        val rand = new Random(System.currentTimeMillis())
        val random_index = rand.nextInt(new_sun .length)
        val result = new_sun(random_index)
        var guess = println("_ " * result.length)
    } else {
        println("You have to input the word with length of 5 < 100")
    }
    return i.toString
}

继续前进......

for (i <- args(1))

什么是args(1),它来自哪里?它必须是一个选项或某种类型的集合,用于for-comprehension,其内容必须与ab的类型相同,以便进行i > a && i < b比较有效。所以我假设args(1)返回Option[Int],集合似乎不太可能。

val random_index = rand.nextInt(new_sun .length)
val result = new_sun(random_index)

同样的问题。什么是new_sun以及它来自何处。这个名字什么也没告诉我。 new_sun .length中的空格也很奇怪。

for (i <- args(1)) {
  if (i > a && i < b) {

写得更好:

for (i <- args(1) if i > a && i < b) {

甚至

args(1) filter (a to b contains _) map { i =>

但遗憾的是,你不能这样做,因为尽管有保护条件,值i仍被用作返回值。

这也提醒我:

var a = 5
var b = 100
...
if (i > a && i < b) ...
else println("You have to input the word with length of 5 < 100")

换句话说,这是检查5 < i < 1006 <= i <= 99。该检查与错误消息不匹配。

var guess = println("_ " * result.length)

println返回Unit。绝对没有理由将此返回值分配给从未使用过的变量。

return i.toString
Scala中很少需要

return语句,其中评估的最终表达式将成为返回值。您不能简单地删除该关键字,因为它会与其他问题进行交互并停止您的代码编译。


通常,您希望编写代码,以便if/else阻止,for-comprehension和其他此类构造不会执行副作用(例如调用println)。相反,您应该尝试将这些块评估为String,然后在方法结束时将此评估的字符串传递给println

您还需要更多地了解您拥有的变量,它们的来源以及它们的名称信息。

并注意您的语法/布局/格式。程序员在宗教方面的斗争越来越少......

答案 1 :(得分:5)

那么,为什么不简单地编写类似的东西来随机选择List [String]中的String?

def randomString(liste: List[String]) =
  util.Random.shuffle(liste).head

然后您可以创建另一个功能来在屏幕上打印结果

答案 2 :(得分:1)

您的println不会尝试打印结果。尝试:

println("result: " + result)

(注意'+'是正确的字符串连接运算符,而不是'*')

每次在内循环中重新创建rand也是不必要和低效的。