在Groovy中将字符串转换为ArrayList

4

我有一个字符串:String str = "[aa,bb,cc,dd]"。我想将其转换为Groovy中的列表,如[aa, bb, cc, dd]。是否有任何可用于此类型转换的Groovy方法?


1
如果你得到了这个字符串,是因为你在“真正”的列表上(不小心)执行了toString操作,最好还是防止这种情况发生。否则就会出现意外:["1,2"].toString() => [1,2] - cfrick
我需要将一个列表存储到数据库中,并且能够将其作为列表返回,你可以给我更好的解决方案吗? - Sayem
使用一种格式来序列化和反序列化数据,并选择一个能够容纳所需数据类型的格式。例如,对于List<String>,可以使用JSON格式。或者既然已经在Grails上了,为什么不将其作为GORM类上的List<String>并将其存储为它本身呢? - cfrick
4个回答

9

使用正则表达式的replaceAll函数

String str = "[aa,bb,cc,dd]"
def a = str.replaceAll(~/^\[|\]$/, '').split(',')
assert a == ['aa', 'bb', 'cc', 'dd']

编辑:

以下版本略微冗长,但处理了额外的空格

String str = " [ aa , bb , cc , dd ] "
def a = str.trim().replaceAll(~/^\[|\]$/, '').split(',').collect{ it.trim()}
assert a == ['aa', 'bb', 'cc', 'dd']

6
你应该按照以下步骤尝试:-
String str = "[aa,bb,cc,dd]"
assert str[1..str.length()-2].tokenize(',') == ['aa', 'bb', 'cc', 'dd']

希望这能有所帮助.. :)

3
将"[,]"进行分词。 - railsdog
1
str[1..str.length()-2] 可以简化为 str[1..-2] - Gergely Toth

2

Here you go:

String str= "['aa', 'bb', 'cc', 'dd']"
assert Eval.me(str) == ['aa', 'bb', 'cc', 'dd']

Eval就是你需要的。


4
如果这个字符串来自外部系统或用户,使用 Eval 并不是真正安全的选择。我更倾向于使用真正的解析器/正则表达式来处理它,而非 eval。 - Jérémie B
@JérémieB,是的,你说得对,在这种情况下使用正则表达式会更好。 - Opal

0

另一种不使用replaceAll和tokenize的方法:

def s = '[aa,bb,cc,dd]'
def a = []
s.eachMatch( /[\[]?([^\[\],]+)[,\]]?/ ){ a << it[ 1 ] }
assert '[aa, bb, cc, dd]' == a.toString()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接