Scala 将列表随机化

Scala 将列表随机化,scala,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.currentTim

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

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
        }
}
def long(a:Int,b:Int):字符串={
变量a=5
var b=100
对于(i a和i
您的println不会尝试打印结果。尝试:

println("result: " + result)
(注意“+”是正确的字符串串联运算符,而不是“*”)


每次在内部循环中重新创建rand也是不必要的,而且效率低下。

那么,为什么不简单地编写这样的内容,在列表[String]中随机选择一个字符串呢

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

然后,您可以创建另一个函数将结果打印到屏幕上

这里有很多错误,以至于很难知道从哪里开始。一次取一个碎片:

def long
真的,令人难以置信的糟糕的方法名称

def long(a: Int, b: Int): String = {
  var a = 5
  var b = 100
您将
a
b
作为参数,然后立即隐藏名称以创建变量。这些参数是无用的

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

for (i <- args(1))
同样的问题。什么是新太阳?它来自哪里。名字告诉我什么。
new_sun.length
中的空格看起来也很奇怪

for (i <- args(1)) {
  if (i > a && i < b) {
但遗憾的是,您不能这样做,因为不管保护条件如何,值
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")
println
返回
Unit
。绝对没有可能的理由将此返回值指定给从未使用过的变量

return i.toString
return
语句在Scala中很少需要,在Scala中,最终计算的表达式将成为返回值。但是,您不能简单地删除关键字,因为它会与其他问题交互,并会停止代码编译


通常,您希望编写代码以使
if/else
块(用于理解)和其他此类构造不会执行副作用(例如调用
println
)。相反,您应该尝试将这些块求值为
字符串
,然后将此求值字符串传递给方法末尾的
println

您还需要更加了解您拥有的变量、它们来自何处以及它们的名称的信息量


注意你的语法/布局/格式。程序员们一直在用宗教的方式争取更少的时间。

(另外,调用函数“long”可能是个坏主意。)这是hangman,这个操作符是对的,他想打印一些下划线。从技术上讲,代码中也没有循环
if/else
绝对不是一个循环,而
for
看起来像一个循环,但实际上是一个
map/flatMap/filter
Heh,疯狂的东西!谢谢,凯文。这是不是又一次关于刽子手的问题?您正在组合直接输出(println)和返回值(return)。为什么?您也在跟踪给定的参数。这就像是函数、过程和代码片段的混合。顺便问一下:你为什么在当前时间随机初始化?像这样的技术通常会降低随机种子的价值。时间不是你可以添加的任何特殊的随机变量。我不同意随机变量(时间)在简单游戏中的作用,但我不会在每次循环运行中重新初始化它。可能在整个方法之外。考虑到列表的隐含大小,这将是非常低效的。嗯。。。你的“高度低效”是“高度”夸大了(imho:)我已经将我的版本与xs(util.Random.nextInt(xs.length))进行了基准测试,100项列表中的时间长度不到1 timemills……这是一个文件中的单词列表,可能非常大。在一张100000人的名单上,我看到你的算法速度下降了5到10倍。谢谢你写下这个答案。我很害怕不得不这样做。我只走了这么远,然后决定最好在事情变得太过严重之前停止。还是不确定我是否已经通过了那一关。。。
for (i <- args(1) if i > a && i < b) {
args(1) filter (a to b contains _) map { 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")
var guess = println("_ " * result.length)
return i.toString