【问题标题】:Scala For Loop, If StatementsScala For 循环,If 语句
【发布时间】:2016-03-28 21:28:15
【问题描述】:

你能推荐一个更好的方法吗?

val args = "The file on life was now won by the person who saw how to explore."

val argsSeq: Seq[String] = args.replaceAll("[^a-zA-Z0-9\\s]", "").toLowerCase.split(" ").sorted

for(i <- 0 until argsSeq.length){
  for(j <- 0 until argsSeq.length){
    if((argsSeq(i).toCharArray.sorted.deep == argsSeq(j).toCharArray.sorted.deep)) {
      if((argsSeq(i).toCharArray.deep != argsSeq(j).toCharArray.deep))
      {
        println(argsSeq(i) + " " + argsSeq(j))
      }
    }
  }     
}

文件寿命

生活档案

现在赢了

看到了

被看见

谁如何

现在赢了

首先,删除重复的字谜对。

二、替代for ... for ... if ... if结构?

谢谢。

【问题讨论】:

  • 为什么要大写?还要解释你打算做什么,不要只扔代码,看看理解docs.scala-lang.org/tutorials/FAQ/yield.html 更多:为什么不将两个 if 子句加入一个 AND 子句?
  • 谢谢,我用 && 替换了第二个 if ... if。仍然想知道他们是否是替代 for ... for 的更好模式?以及删除文件/生命和生命/文件等重复对的最佳方法。谢谢。

标签: scala if-statement for-loop


【解决方案1】:

这是一个使用 for-comprehensions 的简短版本(不等同于 for 循环,实际上在 Scala 中很常见):

for {
  a <- argsSeq
  b <- argsSeq.dropWhile(_ != a) if a != b && a.sorted == b.sorted
} yield println(s"$a $b")

哪些打印:

file life
how who
now won
saw was

【讨论】:

  • 我不确定你所说的“for循环”是什么意思,但如果是OP写的,它们实际上是等价的。
  • for ( a :4: error: ')' 预期但发现 ':5: error: '(' 预期但发现标识符。如果 a != b && a.sorted == b.sorted
  • 根据我在以下链接中看到的内容,我将大括号 {} 更改为 ()。这解决了一个错误,但我仍然得到上述错误。 docs.scala-lang.org/tutorials/tour/sequence-comprehensions.html
  • 已解决 - 不知道为什么,但是当我将 Tzach 的代码放在一行时,这解决了我上面提到的错误。
【解决方案2】:
val args = "The file on life was now won by the person who saw how to explore."
val argsSeq: Array[String] = args.replaceAll("[^1-zA-Z0-9\\s]", "").toLowerCase().split(" ").sorted

val argsSeq_1 = argsSeq.map ( x => (x.toCharArray().sorted.deep, x) ).toList
val argsSeq_2 = argsSeq_1.groupBy(_._1)
val argsSeq_3 = argsSeq_2.map(x => x._2).filter(x=> x.length == 2).map(x => x(0)._2 + "," + x(1)._2)

println(argsSeq_1)
println(argsSeq_2)
println(argsSeq_3)

众所周知,scala中的函数式编程范式,通常for循环不应该在scala中使用,因为它是命令式的。

我也是 scala 的新手。我认为您可以制作一个键值对列表,即(单词数组)-单词和按键分组(单词数组)。然后提取列表中的两个单词,生成一个新的列表。

抱歉,我的回答似乎不太清楚,因为英语不是我的第一语言。您可以使用 3 个 println() 语句来了解我的想法。

最后,argsSeq_3 是 List(now,won, the,the, file,life, saw,was, how, who)。

【讨论】:

  • 干得好弗兰基。我喜欢你关于摆脱 for 循环的观点,因为它是迭代的;功能性会更好。结果必须与我在上面显示的一样(不是您的 argsSeq_3),除非删除了重复对。
  • @user3439308 哦,我的结果中有一个元组(the)。只需为 val argsSeq_3 添加一个额外的过滤器。最后修改为“val argsSeq_3 = argsSeq_2.map(x => x._2).filter(x=> x.length == 2).map(x => (x(0)._2, x(1). _2)).filter(x => x._1 != x._2)",就可以得到正确的结果了。
  • 不错!我将研究如何删除“the,the”,因为我只寻找字谜对,但感谢您将 for 替换为 map。
  • @user3439308 很高兴看到它有帮助
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2019-06-09
相关资源
最近更新 更多