用于将嵌套的List String表示转换回List的Groovy/Java方法

Jör*_*yer 3 java arrays string groovy list

我需要将嵌套List的String表示形式转换回Groovy/Java中的嵌套List(of Strings),例如

String myString = "[[one, two], [three, four]]"
List myList = isThereAnyMethodForThis(myString)
Run Code Online (Sandbox Code Playgroud)

我知道,有一个分裂的字符串用逗号比如Groovy的.split方法,我可以使用正则表达式来识别之间[和]嵌套列表,但我只是想知道,如果有一个现有的方法可以做到这一点,或者如果我必须自己编写这段代码.

我想最简单的事情是List构造函数,它将String表示作为参数,但我还没有找到这样的东西.

tim*_*tes 7

在Groovy中,如果你的字符串是这样分隔的,你可以这样做:

String myString = "[['one', 'two'], ['three', 'four']]"
List myList = Eval.me(myString)
Run Code Online (Sandbox Code Playgroud)

但是,如果它们没有像你的例子那样分隔,我认为你需要开始玩shell和自定义绑定...

class StringToList extends Binding {
  def getVariable( String name ) {
    name
  }
  def toList( String list ) {
    new GroovyShell( this ).evaluate( list )
  }
}

String myString = "[[one, two], [three, four]]"
List myList = new StringToList().toList( myString )
Run Code Online (Sandbox Code Playgroud)

编辑解释事情

Groovy中的Binding "表示脚本的变量绑定,可以从脚本对象外部更改,也可以在脚本外部创建并传递给脚本."

所以在这里,我们创建一个自定义绑定,在请求变量时返回变量的名称(将其视为将任何变量的默认值设置为该变量的名称).

我们将此设置为GroovyShell用于评估变量的Binding,然后通过Shell运行表示我们列表的String.

每个壳牌遇到时间one,two等等,它假定它是一个变量名,去寻找在绑定变量的值.绑定只返回变量的名称,并将其放入我们的列表中

另一个编辑......我找到了一个更短的方式

您可以在Groovy中使用Maps作为绑定对象,并且可以withDefault对Maps 使用闭包,这样当缺少键时,此闭包的结果将作为该键的默认值返回. 这里可以找到一个例子

这意味着,我们可以将代码缩减为:

String myString = "[[one, two], [three, four]]"
Map bindingMap = [:].withDefault { it }
List myList = new GroovyShell( bindingMap as Binding ).evaluate( myString )
Run Code Online (Sandbox Code Playgroud)

如您所见,Map(感谢withDefault)返回传递给它的键(如果Map中缺少该键).