2016-07-18 3 views
2

У меня есть строка как: String str = "[aa,bb,cc,dd]". Я хочу преобразовать это в список в groovy, как [aa, bb, cc, dd]. Любой метод groovy, доступный для преобразования этого типа?Преобразование String в массивList в groovy

+1

В случае, если вы получили эту строку, потому что вы делаете (случайный) 'toString' на«реальный»список, вы лучше предотвращать, что , В противном случае это случайность: '[" 1,2 "]. ToString() => [1,2]' – cfrick

+0

Мне нужно сохранить список в базе данных, также вернуть это как список, можете ли вы дать мне лучшее решение. – Sayem

+0

Используйте формат, который преобразуется в (де) сериализовать данные и выбирает один, который может хранить требуемый тип данных. Например. для списка вы можете использовать JSON. Или, поскольку вы уже на Grails, почему бы не сделать его списком в классе GORM и просто сохранить его как то, что он есть. – cfrick

ответ

4

Вы должны попробовать, как показано ниже: -

String str = "[aa,bb,cc,dd]" 
assert str[1..str.length()-2].tokenize(',') == ['aa', 'bb', 'cc', 'dd'] 

Надеется, что это помогает .. :)

+1

Возможно, упростить бит: tokenize ('[,]') – railsdog

+1

'str [1..str.lenght() - 2]' можно упростить до 'str [1 ..- 2]' –

2

Здесь вы идете:

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

Eval является то, что вам нужно.

+4

Если эта строка поступает из внешней системы или пользователя, на самом деле небезопасно использовать Eval для этого. Я предпочитаю использовать настоящий парсер/регулярное выражение для этого, чем eval –

+0

@ JérémieB, да, вы правы, в таком сценарии гораздо лучше использовать регулярное выражение. – Opal

5

Использованию регулярных выражений replaceAll

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

EDIT:

Следующая версией является бит более подробный, но обрабатывает дополнительные пробелы

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

другой способ без replaceAll & токенизировать:

def s = '[aa,bb,cc,dd]' 
def a = [] 
s.eachMatch(/[\[]?([^\[\],]+)[,\]]?/){ a << it[ 1 ] } 
assert '[aa, bb, cc, dd]' == a.toString() 
Смежные вопросы