从逗号 sep 属性列表创建数组的更优雅的解决方案?

Posted

技术标签:

【中文标题】从逗号 sep 属性列表创建数组的更优雅的解决方案?【英文标题】:A more elegant solution to creating an array from comma sep list of properties? 【发布时间】:2011-04-01 16:53:48 【问题描述】:

在我的属性文件中,我有一个属性,其中包含一个逗号分隔的值列表

在我的代码中,我想加载该属性,将其从逗号中拆分出来,然后将每个值添加到一个数组中。由于空格等原因,我还想确保数组中没有值

示例属性:

prop_allowed_extensions = .jpeg,tiff, .txt 

到目前为止我已经想出了这个,但是感觉很脏,有没有更优雅的解决方案?

String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
String[] splitString = StringUtils.split(test, ',');
String[] newString = new String[splitString.length];             
for (int i = 0; i < splitString.length; i++)

   newString[i] = StringUtils.trim(splitString[i]);                

我只想要文件扩展名的文本,使用正则表达式删除空格/非字母是否合适?

【问题讨论】:

显然没有人阅读这个问题。再次阅读最后一句话:他只想要文件扩展名的文本(如果存在,必须去掉句点)。这里几乎没有任何解决方案可以做到这一点。 【参考方案1】:

Apache Jakarta Commons Configuration 以简洁的方式处理属性文件,允许您指定不同格式的列表:

colors.pie = #FF0000, #00FF00, #0000FF

colors.pie = #FF0000;
colors.pie = #00FF00;
colors.pie = #0000FF;

然后得到这样的列表:

String[] colors = config.getStringArray("colors.pie");
List colorList = config.getList("colors.pie");

见How-to

【讨论】:

如果你不想使用它,你可能有兴趣看看他们在代码中是如何做到的:) 我投票赞成这个和蒂姆的回答。如果您不介意将另一个库添加到您的依赖项中,这是我的首选方法。此外,如果有一个图书馆已经可以做到这一点,为什么要自己做呢?【参考方案2】:

您可以分两步完成:

String[] allowedExtensions = str.replaceAll("[^\\w,_]", "").split(",")

(首先杀死任何不是逗号、下划线或单词字符(字母或数字)的字符,然后拆分生成的字符串

【讨论】:

可能是不必要的限制。文件扩展名通常有下划线等。 从来没有听说过文件扩展名中有下划线,但我还是会添加它们。【参考方案3】:

我个人会将其简化为以下(请记住,String.split() 采用正则表达式),但我不知道您是否认为它更优雅:

String test = classProperties.getProperty("prop_allowed_extensions",
        "txt, jpeg");
String[] extensions = test.trim().split("\\s*,\\s*");

编辑:您也可以删除每个扩展程序上的前导点(如果存在)(此方式或其他几种方式之一):

String[] test = classProperties.getProperty("prop_allowed_extensions",
        "txt, jpeg").trim().split("^\\.", 2);
String[] extensions = test[test.length - 1].split("\\s*,\\s*.?");

【讨论】:

不完整,因为可能有需要删除的时期。模式必须是这样的:“\\s*,\\s*\\.?”,但无论如何,初始时期都会打破它。 是在 split() 之前执行 trim() 吗?如果是这样,那么它将如何删除字符串内的空格,即不在任一端? “属性,属性” @James:您不仅要拆分逗号,还要拆分逗号加上前后空格。由于分隔符在结果数组中被忽略,因此空格将被排除。修剪摆脱了边界情况。 @seanizer:我认为 OP 不清楚。我们被引导相信他在帖子中的例子是一种功能上有效的方式来做他想做的事情,这留下了点。他的描述似乎暗示他不想要这个点。这个答案在功能上等同于他的代码。 @James - 马克说得对,修剪调用处理属性字符串末尾和开头的空格。最初我曾尝试在 "^\\s*|\\s*,\\s*|\\s$" 上拆分以完全避免该调用,但拆分将返回前导空字符串,因此您会得到一个不受欢迎的在这种情况下,清空数组中的第一个元素。这样可以确保您不会。【参考方案4】:

按照你的模式,你可以这样做:

String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
List<String> extensions = new ArrayList<String>();         
for (String part:test.split(",")) 
   extensions.add(part.trim());               

不同之处在于结果现在在列表中。 test.split(",") 只会被调用一次,所以不存在性能问题。

【讨论】:

尝试将其保留为 String[] 以便我可以在 FileUtils.listAllFiles commons.apache.org/io/api-1.4/org/apache/commons/io/… 中使用它 你可以做 extensions.toArray(new String[extensions.size()]) 得到一个 String[] 传递给 FileUtils.listAllFiles。 呃,那么进入列表有什么意义呢? Gits 和 shiggles? 该列表在那里,因此您可以有一些地方放置扩展,而不必担心事先分配足够的空间或在进行过程中对其进行管理。 是的,但是 string.split() 已经解决了这个问题。我也看不出在这里使用列表的意义。【参考方案5】:
String[] allowedFormats = classProperties
                           .getProperty("prop_allowed_extensions", "txt, jpeg")
                           .replaceAll("[ \\.]","")
                           .split(",");

使用 Java 1.5 或更高版本,数组格式。

【讨论】:

不会去掉“jpeg”之前的空格。 也不会去掉句号 @seanizer 实际上,这就是 split(",") 的用途。 不,我说的不是逗号,而是句号。阅读问题。示例数据是“.jpeg,tiff,.txt”,他说他想丢失所有非字母【参考方案6】:

这要简单得多:

String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
String[] splitString = test.trim().split("\\s*,\\s*");

(需要 Java 5)

【讨论】:

【参考方案7】:
String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
String[] splitString = StringUtils.split(test, ',');
for(String s : splitString) 
    s = StringUtils.trim(s);

会稍微优雅一些​​,但 Java 不支持 .net 之类的 LINQ,您可以完全避免显式循环。

【讨论】:

-1 这不起作用。您正在重新分配局部变量,而不是更改数组值 你是对的,所以我什至需要带有整数索引的 for 循环。 是的,增强的 for 循环只允许读取,不能更改或删除。

以上是关于从逗号 sep 属性列表创建数组的更优雅的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

从数组列表中删除重复项

在 Swift 中用数组序列化我自己的对象的更优雅的方法是啥

在环绕的一维数组网格中寻找邻居的更优雅的方法?

通过多个可能的属性值进行选择的更简洁的方法?

使用 jquery 从数组列表中添加和删除数组项

数组中的逗号分隔列表