Scala For循环,如果声明

时间:2016-03-28 21:28:15

标签: scala if-statement for-loop

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

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))
      }
    }
  }     
}

档案生活

谁是

生活档案

现在赢了

看到了

看到了

谁如何

现在赢了

首先,删除重复的anagram对。

第二,替代for ... for ... if ... if structure?

谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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中的函数式编程范例,通常用于循环不应该用于scala,因为它是势在必行的。

我也是scala的新手。我想你可以列出一个键值对的列表,它是(word的数组)-word和group by key(word的数组)。然后在列表中提取两个单词并生成一个新列表。

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

最后,argsSeq_3是List(现在,赢了,the,the,file,life,saw,was,how,who)。