2015-10-27 24 views
1

在Java代码中,我有11个不同的字符串,其中一些(最多9个)可以为null。字符串是对象的一部分。如果其中没有一个是空的,我做一个字符串是这样的:如何在Java中高效地创建字符串

string1 + "," + string2 + "," + string3 + "," + string4 + "," + string5 + "," + string6 + "(" + string7 + ")" + string8 + string9 + "+" + string10 + string11 

如果其中没有一个是空,那有什么?。但其中一些可能为空。如果我检查它们是否都是null,代码会变得非常慢并且很长。我怎样才能以高效和快速的方式生成这样的字符串?谢谢。

+2

你能使用数组? – Arc676

+0

当字符串为空时,你想得到什么结果?就目前而言,你只需在结果中得到字符串“null” - 不会有错误或类似的错误。 – RealSkeptic

+0

@ Arc676你可以用一个简单的例子来演示吗?谢谢。 – jason

回答

3
public static void main(String[] args) { 
    String string1 = "test1"; 
    String string2 = "test2"; 
    String string3 = "test3"; 
    String string4 = null; 
    String string5 = "test5"; 

    StringBuilder stringBuilder = new StringBuilder(); 

    List<String> valueList = new ArrayList<>(); 
    valueList.add(string1); 
    valueList.add(string2); 
    valueList.add(string3); 
    valueList.add(string4); 
    valueList.add(string5); 
    // etc. 

    for (String value : valueList) { 
     if (value != null) { 
      stringBuilder.append(value); 
     } 
     else { 
      value = ","; 
      stringBuilder.append(value); 
     } 
    } 
    System.out.println(stringBuilder); 
} 

输出:

test1test2test3,TEST5

+1

问题是输出字符串中有部分应该放在圆括号中,部分不能用逗号分隔,部分用'+'分隔...... – RealSkeptic

2

与Java 8,你可以用这个用逗号分隔的字符串的第一部分:

String part1 = Stream.of(string1, string2, string3, string4, string5, string6) 
        .filter(Objects.notNull()) 
        .collect(joining(","); 

从那时你有一个不规则的结构,所以你需要定制逻辑来处理它。帮手功能

static String emptyForNull(String s) { 
    return s == null ? "" : s; 
} 

可以让你的一部分。

1

如果你只是希望你的代码尽可能短,使用String.format并摆脱字符串中的“空”。

String result = String.format("%s,%s,%s,%s,%s,%s(%s)%s,%s,%s,%s", 
      string1, string2, string3, string4, string5, 
      string6, string7, string8, string9, string10, 
      string11); 

    System.out.println(result.replace("null", "")); 
1

在Java 8中,您可以流和收藏家参加,并与对象的类过滤

List<String> strings = Arrays.asList("first", "second", null, "third", null, null, "fourth"); 
String res = strings.stream().filter(Objects::nonNull).collect(Collectors.joining(",")); 
System.out.println(res); 

结果输出

first,second,third,fourth 
1

如果字符串的第六届指数始终包围通过()然后你可以使用下面的代码。

List<String> vals = new ArrayList<>(); 
    vals.add(string1); 
    vals.add(string2); 
    vals.add(string3); 
    vals.add(string4); 
    vals.add(string5); 
    vals.add(string6); 
    vals.add(string7); 
    vals.add(string8); 
    vals.add(string9); 
    vals.add(string10); 
    vals.add(string11); 

    for (int i =0 ; i < vals.size(); i++) { 
     // check null values 
     if (vals.get(i) != null) { 
     // as your requirement surround 7th value with (and) 
      if(vals.indexOf(vals.get(i)) == 6) { 
       values += "\b(" + vals.get(i)+")"; 
      } else { 
       values += vals.get(i)+","; 
      } 
     } 
    } 
    System.out.println(values+"\b"); 

输出,如果 第4和第9个字符串null然后,

test1,test2,test3,test5,test6(test7)test8,test10,test11