Рандомизация списка - PullRequest
       0

Рандомизация списка

0 голосов
/ 26 февраля 2011

Я написал функцию для случайного выбора одного слова из списка слов. Вот мой код. Но он не может выбрать одно слово и не может напечатать. Пожалуйста, скажите мне, что не так с моим кодом.

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 ]

11 голосов
/ 26 февраля 2011

Здесь многое пошло не так, так трудно понять, с чего начать. Взятие одного фрагмента за раз:

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 выровнена, чтобы выглядеть как закрывающая скобка для предложения 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), откуда оно? Это должна быть опция или какая-то коллекция для использования в целях понимания, и ее содержимое должно быть того же типа, что и a и b, чтобы сравнение 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 < 100 или 6 <= i <= 99 другими словами. Проверка не соответствует сообщению об ошибке.

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

println возвращает Unit. Нет абсолютно никакой возможной причины присваивать это возвращаемое значение переменной, которая никогда не используется.

return i.toString

return операторы редко нужны в Scala, где окончательное вычисленное выражение станет возвращаемым значением. Вы не можете просто удалить ключевое слово, так как оно взаимодействует с другими проблемами и остановит компиляцию кода.


Как правило, вы хотите написать свой код так, чтобы блоки if/else, для-понимания и другие подобные конструкции не вызывали побочных эффектов (таких как вызов println). Вместо этого вы должны попытаться сделать эти блоки равными String, а затем передать эту оцененную строку в println в конце вашего метода.

Вам также нужно гораздо лучше понимать, какие у вас переменные, откуда они берутся и насколько информативны их имена.

и обратите внимание на ваш синтаксис / макет / форматирование. Программисты боролись за религиозные пути меньше ...

5 голосов
/ 26 февраля 2011

Ну, а почему бы просто не написать что-то подобное для случайного выбора строки в списке [String]?

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

Затем можно создать другую функцию для печати результата на экране

1 голос
/ 26 февраля 2011

Ваш println не пытается напечатать результат.Попробуйте:

println("result: " + result)

(примечание '+' является правильным оператором конкатенации строк, а не '*')

Нет необходимости и неэффективно каждый раз заново создавать rand во внутреннем цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...