Идиоматическое понимание списка Scala - первый соответствующий элемент - PullRequest
7 голосов
/ 20 февраля 2012

Ребята, в последнее время я писал некоторый код в Scala, чтобы научить себя языку, и в некоторых недавних экспериментах я использовал библиотеку НЛП для создания набора слов, помеченных частью речи из ввода пользователя.

Я хочу написать функцию, которая дает мне первый глагол в предложении.Если глаголов нет, то я хочу предположить, что первое слово в наборе - это глагол (например, если игрок только что набрал «кто» или «время работы», это считается глаголом в моей игре).

Ниже приведен блок кода, настолько уродливый, что может любить только мать, и он воняет императивным программированием, и я хочу преобразовать его в нечто более похожее на идиоматическое Scala, в идеале то, что в нем нет ни одного оператора «если».

def firstVerb = {
    if (words.size == 1)
        words.head.value
    else {
        val outWords = words.filter( word => word.pos == Verb)
        if (outWords == Set.empty) 
            words.head.value
        else
            outWords.head.value 
    }
}

Переменная "words" имеет тип ListBuffer [EnrichedWord], где EnrichedWord - мой класс, который содержит часть речи (pos, содержит объекты case, такие как Verb, Noun и т. Д.) И оригинал.слово (значение).

Любое руководство, которое вы, гены Scala, можете дать при рефакторинге этого ужасного кода, было бы фантастическим.

Ответы [ 2 ]

9 голосов
/ 20 февраля 2012

Это дополнительно обрабатывает случай, когда words пусто, попробуйте это:

words.find(_.pos == Verb).orElse(words.headOption).map(_.value).getOrElse("")

Если вы уверены, что words никогда не будет пустым Set, этот проще:

words.find(_.pos == Verb).getOrElse(words.head).value

Кстати, если вы используете HashSet, то, что какой-то элемент является первым, на самом деле не имеет смысла.Если каждый элемент представляет слово в предложении, это должен был быть List или Seq.

2 голосов
/ 20 февраля 2012

Каноническая (бессмысленная) версия, вероятно:

words find(_.pos == Verb) orElse words.headOption map _.value getOrElse ""

Другой вариант:

(words.find(_.pos == Verb) ++ words.take(1)).take(1).map(_.value).mkString
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...