2012-05-18 2 views
0

У меня есть List[List[]]Scala Список ToString()

List(List(1,2), List(3,4)) 

Если я позвоню toString() на нем

List(List(1,2), List(3,4)).toString()

Можно ли восстановить обратно оригинальный List[List[]] если да, то как?

Спасибо.

+3

Я не полагаюсь на преобразование вывода toString в объект. что, если изменяется реализация toString? Почему у вас есть такое требование, и можете ли вы использовать любые другие средства для сериализации информации? – aishwarya

ответ

2

В Scala, как и в Java (и даже Python, хотя библиотеки обычно придерживаются соглашения), нет никакой гарантии, что .toString создаст что-то, что скомпилировано, будет воссоздавать объект. Фактически, обычные типы, такие как Long и String, не создают вывод строки, который можно использовать для их воссоздания.

Обратите внимание, что стандартный способ получения вывода, который может использоваться для воссоздания экземпляров, составляет Сериализация. Если это то, что вы хотите, посмотрите.

2

Вы просто хотите разобрать строку, которую вы получаете от toString? Если да нет родного способа сделать это (как в Python eval или Хаскель read, например), но вы можете очень легко свернуть свой собственный с Scala parser combinator library:

import scala.util.parsing.combinator._  

object parseIntListList extends RegexParsers { 
    def list = "List(" ~> repsep("\\d+".r ^^ (_.toInt), ",") <~ ")" 
    def apply(s: String) = parse("List(" ~> repsep(list, ",") <~ ")", s) 
} 

Теперь parseIntListList(List(List(1, 2), List(3, 4)).toString) делает то, что вы хотите, и анализатор устойчив к дополнительным пробелам и т. д.

Существует, безусловно, лучший способ сделать то, что вы пытаетесь сделать в Scala.

0

Знаете ли вы, что это список из списка Int?

val li = List(List(1,2), List(3,4)) 
val s = li.toString 

s.replaceAll ("[^0-9) ]", "").split ("\\)").map(_.split (" ").filterNot (_.equals ("")).map (_.toInt).toList).toList 
res86: List[List[Int]] = List(List(1, 2), List(3, 4)) 
Смежные вопросы