2017-08-02 78 views
0

有一个从文件读取,如下列表:如何将“<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) 
+1

您需要阅读有关Scala的类型系统。 Scala是*静态类型*,这意味着列表不能包含不同类型的元素。你需要重新思考你的方法,并可能创建一个案例课来表示你的可能性。 –

+0

@SilvioMayolo是正确的。 “结果”是什么类型?如列出的,它不是'List [String]',它也不是'List [List [String]]'。 – jwvh

+0

@SilvioMayolo它可以,如果预期:'结果:List [List [String]] = List(List(a),List(b),List(,,),List(c) ,,),列表(d))? – mop

回答

1

这似乎工作。

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,和子列表,可以通过预先待决的,处理列表时,这是最有效的来构建。

+0

thx。顺便说一句,如果可以从“”判断为“”。因为一些连续行包含 “”,但这些是不理想的 – mop

+0

'线:列表[字符串] =列表(A,B,,,,C,,, d è)' 预期: '结果:列表[列表[字符串]] =列表(列表(a)中,列表(b)中,列表(,,),列表(c)中,列出(,,),列表( d),列表( e))'。只能通过您的代码将“”中的元素合并为“” – mop

+0

。现在我有一个想法是修改正则表达式。例如:' val result = lines.foldRight(List [List [String]]()){ case(s,lls)=> if(s.matches(“ *( |)* “​​) && lls.nonEmpty && lls.head.head.matches(” *( |)。*“)) (S :: lls.head):: lls.tail 其他 列表:: lls } ' – mop

相关问题