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

Java 从属性列表创建数组的更优雅的解决方案?,java,arrays,properties,Java,Arrays,Properties,在我的属性文件中,我有一个属性,它包含一个逗号分隔的值列表 在我的代码中,我希望加载该属性,将其从逗号中拆分,然后将每个值添加到一个数组中。我还想确保由于空格等原因,数组中没有值 示例属性: prop_allowed_extensions = .jpeg,tiff, .txt 到目前为止,我已经想出了这个办法,但感觉很脏,有没有更优雅的解决方案 String test = classProperties.getProperty("prop_allowed_extensions", "txt,

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

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

示例属性:

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]);                
}
String test=classProperties.getProperty(“prop_允许扩展名”,“txt,jpeg”);
String[]splitString=StringUtils.split(测试,,);
String[]newString=新字符串[splitString.length];
for(int i=0;i

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

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

String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
List<String> extensions = new ArrayList<String>();         
for (String part:test.split(",")) {
   extensions.add(part.trim());               
}
String[] colors = config.getStringArray("colors.pie");
List colorList = config.getList("colors.pie");
String test=classProperties.getProperty(“prop_允许扩展名”,“txt,jpeg”);
列表扩展=新建ArrayList();
对于(字符串部分:test.split(“,”)){
extensions.add(part.trim());
}
不同之处在于,结果现在在列表中<代码>测试。拆分(“,”
将只调用一次,因此没有性能问题

String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
String[] splitString = StringUtils.split(test, ',');
for(String s : splitString) {
    s = StringUtils.trim(s);
}
会稍微优雅一点,但Java不支持类似LINQ的.net,这样可以完全避免显式循环

String[] allowedFormats = classProperties
                           .getProperty("prop_allowed_extensions", "txt, jpeg")
                           .replaceAll("[ \\.]","")
                           .split(",");

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

您可以通过两个步骤完成:

String[] allowedExtensions = str.replaceAll("[^\\w,_]", "").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");
String[] splitString = test.trim().split("\\s*,\\s*");
(需要Java 5)

以干净的方式处理属性文件,允许您以不同格式指定列表:

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

然后得到如下列表:

String test = classProperties.getProperty("prop_allowed_extensions", "txt, jpeg");
List<String> extensions = new ArrayList<String>();         
for (String part:test.split(",")) {
   extensions.add(part.trim());               
}
String[] colors = config.getStringArray("colors.pie");
List colorList = config.getList("colors.pie");


请参见

尝试将其保留为字符串[],以便我可以在FileUtils.listalfiles You can do extensions.toArray(新字符串[extensions.size()])中使用它来获取字符串[]如果要传递到FileUtils.listAllFiles.Uh,那么转到列表的意义是什么?Gits和shiggles?列表就在那里,这样您就可以有一些地方放置扩展,而不必担心事先分配足够的空间或在进行操作时对其进行管理。是的,但是string.split()我已经注意到了。我也不认为在这里使用列表有什么意义。如果你不想使用它,你可能有兴趣看看他们在代码中是如何做到的:)我投票支持这个和Tim的答案。如果您不介意向依赖项添加另一个库,这是我首选的方法。此外,如果有一个图书馆已经可以做到这一点,为什么要自己做对呢?可能是不必要的限制。文件扩展名通常有下划线,等等。我从未听说过文件扩展名中有下划线,但我还是会添加它们。不完整,因为可能需要删除一些句点。模式必须是:“\\s*,\\s*\\。?”,但初始句点会打断它。在拆分()之前是否执行trim()?如果是这样,那么它将如何删除字符串中的空白(不在两端)?“properties,properties”@James:你不只是在用逗号分割,而是用逗号加上前面/后面的空格。由于分隔符在结果数组中被忽略,因此空格将被排除。修剪去掉了边界情况。@seanizer:我认为OP不清楚。我们被引导相信,他在《华盛顿邮报》中的例子是一种在功能上有效的方式来做他想做的事情,这就留下了问题。他的描述似乎暗示他不想要这个圆点。这个答案在功能上等同于他的代码。@James-Mark的右边,trim调用处理属性字符串末尾和开头的空格。最初我尝试在“^\\s*| \\s*,\\s*| \\s$”上拆分以避免调用,但拆分将返回前导的空字符串,因此在这种情况下,数组中的第一个元素将是不需要的空元素。这确保你不会。不会去掉“jpeg”之前的空格。不会去掉句点,either@seanizer实际上,这就是split(“,”)的含义。不,我不是说逗号,而是句号。阅读问题。示例数据是“.jpeg,tiff,.txt”,他说他想丢失所有非字母-1这不起作用。您正在重新分配局部变量,而不是更改数组值。您是对的,因此我甚至需要带有整数索引的for循环。是的,增强的for循环只允许读取,而不允许更改或删除。显然没有人阅读该问题。再读最后一句话:他只需要文件扩展名的文本(句号必须去掉,如果有的话)。这里几乎没有任何解决方案能做到这一点。