你能推荐一种更好的方法吗?
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?
谢谢。
答案 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)。