有一个从文件读取,如下列表:如何将“<url>”改为“</url>”为List?
lines: List[String] = List(a, b, <url>, <loc>1</loc>, </url>, c, <url>, <loc>2</loc>, </url>, d)
预期:
result = List(a, b, List(<url>, <loc>1</loc>, </url>), c, List(<url>, <loc>2</loc>, </url>), d)
有一个从文件读取,如下列表:如何将“<url>”改为“</url>”为List?
lines: List[String] = List(a, b, <url>, <loc>1</loc>, </url>, c, <url>, <loc>2</loc>, </url>, d)
预期:
result = List(a, b, List(<url>, <loc>1</loc>, </url>), c, List(<url>, <loc>2</loc>, </url>), d)
这似乎工作。
val result = lines.foldRight(List[List[String]]()){
case (s, lls) => if (s.matches("<.+>")
&& lls.nonEmpty
&& lls.head.head.matches("<.+>"))
(s :: lls.head) :: lls.tail
else
List(s) :: lls
}
// result: List[List[String]] = List(List(a), List(b), List(<url>, <loc>1</loc>, </url>), List(c), List(<url>, <loc>2</loc>, </url>), List(d))
lines
从右侧折叠,使得结果List
,和子列表,可以通过预先待决的,处理列表时,这是最有效的来构建。
thx。顺便说一句,如果可以从“
'线:列表[字符串] =列表(A,B,
。现在我有一个想法是修改正则表达式。例如:' val result = lines.foldRight(List [List [String]]()){ case(s,lls)=> if(s.matches(“ *(?url> |?loc>)* “) && lls.nonEmpty && lls.head.head.matches(” *(?url> |?loc>)。*“)) (S :: lls.head):: lls.tail 其他 列表:: lls } ' – mop
您需要阅读有关Scala的类型系统。 Scala是*静态类型*,这意味着列表不能包含不同类型的元素。你需要重新思考你的方法,并可能创建一个案例课来表示你的可能性。 –
@SilvioMayolo是正确的。 “结果”是什么类型?如列出的,它不是'List [String]',它也不是'List [List [String]]'。 – jwvh
@SilvioMayolo它可以,如果预期:'结果:List [List [String]] = List(List(a),List(b),List(,, ),List(c) ,, ),列表(d))? –
mop