[英]What's the most elegant/idiomatic way to check if a string is in a list?
[英]What's the most elegant way to concatenate a list of values with delimiter in Java?
我从来没有找到一种干净利落的方式来做到以下几点。
假设我有一个列表/数组字符串。
abc
def
ghi
jkl
我想将它们连接成一个由逗号分隔的单个字符串,如下所示:
abc,def,ghi,jkl
在Java中,如果我写这样的东西(请原谅语法),
String[] list = new String[] {"abc","def","ghi","jkl"};
String str = null;
for (String s : list)
{
str = str + s + "," ;
}
System.out.println(str);
我去拿
abc,def,ghi,jkl, //Notice the comma in the end
所以我必须重写上面的for循环,如下所示
...
for (int i = 0; i < list.length; i++)
{
str = str + list[i];
if (i != list.length - 1)
{
str = str + ",";
}
}
...
这可以在Java中以更优雅的方式完成吗?
我肯定会使用StringBuilder / Buffer来提高效率,但我想说明这个案例而不是太冗长。 优雅,我的意思是一个解决方案,避免丑陋(?) if
在循环内检查。
这是我的版本: Java技巧:收集字符串中对象的最快方法
StringBuilder buffer = new StringBuilder ();
String delim = "";
for (Object o: list)
{
buffer.append (delim);
delim = ", "; // Avoid if(); assignment is very fast!
buffer.append (o);
}
buffer.toString ();
另外一个好处是:如果循环中的代码更复杂,那么这种方法将产生正确的结果,而不需要复杂的if()
s。
另请注意,对于现代CPU,分配仅在缓存中发生(或者可能仅在寄存器中发生)。
结论:虽然这个代码乍一看看起来很奇怪,但它有很多优点。
StringBuilder builder = new StringBuilder();
for (String st: list) {
builder.append(st).append(',');
}
builder.deleteCharAt(builder.length());
String result = builder.toString();
不要使用'+'表示字符串传染。 它很慢。
我敢打赌,在任何中型Java项目的类路径上都有几个名为“StringUtil”,“StringsUtil”,“Strings”的类或任何类。 最有可能的是,它们中的任何一个都会提供连接功能。 以下是我在项目中找到的一些示例:
org.apache.commons.lang.StringUtils.join(...)
org.apache.wicket.util.string.Wicket.join(...)
org.compass.core.util.StringUtils.arrayToDelimitedString(...)
由于您可能希望将来摆脱一些外部依赖关系,您可能想要这样的事情:
public static final MyStringUtils {
private MyStringUtils() {}
public static String join(Object[] list, String delim) {
return org.apache.commons.lang.StringUtils.join(list, delim);
}
}
现在这就是我所说的“优雅”;)
检查这是否有用:
List<Integer> numbers=new ArrayList<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
numbers.add(6);
String str = " ";
for(Integer s:numbers){
str=str+s+" , ";
}
System.out.println(str.substring(0,str.length()-2));
我会使用StringBuffer
来实现此功能。 String
是不可变的,因此每次连接两个String
,都会创建一个新对象。
使用StringBuffer
更有效:
String[] list = new String[] {"abc","def","ghi","jkl"};
StringBuffer str = new StringBuffer();
for (String s : list) {
str.append(s);
str.append(",");
}
str.deleteCharAt(str.length());
System.out.println(str); //automatically invokes StringBuffer.toString();
for (int i = 0; i < list.length-1; i++) {
str = str + list[i];
str = str + ",";
}
str = str + list[list.length-1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.