![](/img/trans.png)
[英]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.