LINUX.ORG.RU

Вопрос по Scala вывести предложение текста, в котором больше всего слов

 ,


0

2

Всем привет! Задача такая, нужно вывести предложение текста, в котором больше всего слов. Есть только самое начало, по scala не нашел особо литературы, может кто может помочь

import io.Source 
object tryagain {
  def main(args: Array[String]) { 
text("US President-elect Donald Trump has defended his handling of the transition to the White House, amid reports of disarray in his team. A new sentence for text.") 
}
 def text(news: String) 
{ 
news.split(" ").groupBy(x=>x) 
val counts = news.split("\\W+").groupBy(x=>x).mapValues(x=>x.length) 
printsomething(counts) 
}

news.split("[.?!]").foldLeft((0, "")){ (stnc, acc) =>
  val wordsCount = stnc.split(" ").length
  if(wordsCount > acc._1) (wordsCount, stnc) else acc
}
anonymous ()

по scala не нашел особо литературы,

Признайся, даже не искал

[code]news.split(" ").groupBy(x=>x)[/code]

И зачем тут groupBy и зачем тебе тут сплит по словам если тебе предложения нужны?

[code]news.split(«\\W+»).groupBy(x=>x).mapValues(x=>x.length)[/code]

Тебе вроде количество слов нужно а не их длина?

anonymous ()
Ответ на: комментарий от anonymous

Пытаюсь вставить ваш код, показывает ошибки:
value split is not a member of (Int,String)
type mismatch; found : (Int, String) required: String line 12
type mismatch; found : String required: (Int, String) line 12

import io.Source 
object tryagain {
  def main(args: Array[String]) { 
text("US President-elect Donald Trump has defended his handling of the transition to the White House, amid reports of disarray in his team. A new sentence for text.") 
}

  def text(news: String) 
{ 
news.split("[.?!]").foldLeft((0, "")){ (stnc, acc) =>
  val wordsCount = stnc.split(" ").length
  if(wordsCount > acc._1) (wordsCount, stnc) else acc
}
} 


}
shonny ()
Ответ на: комментарий от shonny

я там порядок попутал, stnc, acc в фолде местами поменяй. и после фолда допиши что-то вроде ._2 так функция тест вернет самое длинное предложение, надеюсь что вывод сможешь сам дописать

ЗЫ зачем тебе Scala? и если уж ее выбрал то ознакомся хотябы с этим

anonymous ()
Ответ на: комментарий от migesok

Тестовое задание делаешь, да?

больше на первую практику похоже, но как можно делать практику не зная вообще ничего и не хотя думать - хз

anonymous ()

Есть только самое начало, по scala не нашел особо литературы

The Are of Counting Words in Scala.

anonymous ()
Ответ на: комментарий от shonny

Что-то я не пойму куда ._2 вставлять, не могли бы подсказать? И через println можно же вывести результат?

object tryagain {
  def main(args: Array[String]):Unit = { 
    val longest = text("US President-elect Donald Trump has defended his handling of the transition to the White House, amid reports of disarray in his team. A new sentence for text.")
    println(longest)
  }

  def text(news: String): String = {
    news.split("[.?!]").foldLeft((0, "")){ (acc, stnc) =>
      val wordsCount = stnc.split(" ").length
      if(wordsCount > acc._1) (wordsCount, stnc) else acc
    }._2
  }
}

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

anonymous ()
Ответ на: комментарий от stevejobs

все ли предложения заканчиваются на [.?!] ? xD

я думаю для его случая и этого хватит, а если нет - пусть хоть немного сам допишет

anonymous ()
Ответ на: комментарий от cdshines

Автору темы:

xs.split(регулярка_для_конца_предложений).maxBy(s => s.split(регулярка_для разделителя_слов).size)

cdshines ★★★★★ ()
Последнее исправление: cdshines (всего исправлений: 1)
Ответ на: комментарий от cdshines

Для таких, как ты, есть maxBy

В целом согласен, но в данном случае не принципиально. Да и что-то мне подсказывает что maxBy через тот же foldLeft реализовано (и еще момент: если результат сплита будет пустым то полетит UnsupportedOperationException, что радости может не добавить)

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.