Java 配置文件多维数组

Java config file multidimensional array

我有问题。对于我的代码,我有一个包含以下内容的配置文件:

updateOnInsert=true
removeLast=false

names=Joey Greek, Lisa Blessing, Arnold Verdict

要读取此配置文件,我有以下代码:

ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("configs/main.config");
                
// Read all properties from agent strategy file
Properties properties = new Properties();
properties.load(is);

// Assign all properties to variables
boolean updateOnInsert = Boolean.parseBoolean(properties.getProperty("updateOnInsert"));
boolean removeLast = Boolean.parseBoolean(properties.getProperty("removeLast"));

List<String> names = Arrays.asList(properties.getProperty("names").split(", ", -1));

但现在我需要将名称的格式更改为:

names=[[Joey, Greek], [Lisa, Blessing], [Arnold, Verdict]]

输出变量必须是以下类型:String[][] 结果:

[0] => [Joey, Greek]
[1] => [Lisa, Blessing]
[2] => [Arnold, Verdict]

实现此目标的最佳方法是什么?

试试这样的东西:

String[][] names = Pattern.compile(", ", -1)
                          .splitAsStream(properties.getProperty("names"))
                          .map(s -> s.split(" "))
                          .toArray(String[][]::new);
  • 给定姓名列表,首先流式传输姓名列表。
  • 然后将名称拆分为一个或多个空格。
  • 并将结果数组放入“二维”数组中
List<String> names = Arrays.asList(properties.getProperty("names").split(", ", -1));
String[][] result = names.stream().map(str->str.split("\s+")).toArray(String[][]::new);

您可以通过流式传输从属性文件中读取的原始列表来使其成为一条语句。我省略了它以简化解释。

取决于输入的内容。最安全的方法可能是使用合适的解析器(可能还有不同的文件格式)。

如果列表总是采用 [[Name], [Name]] 的形式并且 Name 从不包含括号,一个简单的方法可能是使用更专业的正则表达式,例如(?<=\]),\s*(?=\[).

关于正则表达式的总结:

  • (?<=\]):正向后视,即任何匹配都必须遵循 ].
  • ,\s*:要拆分(和删除)的实际匹配项,即逗号后跟任何空格
  • (?=\[)"):积极的前瞻,即任何匹配都必须跟在 [.
  • 之后

最后,将每个名字除以,得到二维数组:

//results in Strings like "[Joey, Greek]", "[Lisa, Blessing]", and "[Arnold, Verdict]"
String[] completeNames = properties.getProperty("names").split("(?<=\]),\s*(?=\[)");

//We're using a stream here but you could as well use traditional loops   
String[][] namesInParts = Arrays.stream(completeNames)
           //map the name by removing the brackets and splitting at the comma (followed by any whitespace)
           .map(name -> name.replaceAll("[\]\[]", "").split(",\s*"))
           //collect everything into a new array
           .toArray(String[][]::new);