2016-04-05 3 views
-2

У меня есть 4 строки String 1 ,String 2 ,String 3 , String 4. Я хочу добавить их в строку под названием phones. Однако я не хочу просто: String phones = String 1 + "~" + String 2 + "~" + String 3 +"~" + String 4;Как добавить строки в одну строку, Java?

Если String 2 and 3 пустуют я хотел бы получить: String 1~~~String 4.

Как сделать phones отображать только пустые строки и добавить "~" между каждой строкой? поэтому, если String 2 and 3 пустые, я бы получил: String 1 ~ String 4 вместо этого.

+0

Первые решения работают просто отлично спасибо! Был ли мой вопрос отклонен, потому что он был дубликат или отформатирован неправильно? –

+0

Добро пожаловать в stackoverflow. Извините, что ваш первый вопрос получил негативную реакцию от некоторых. Все ответы также были отменены. В идеале, сначала мы должны быть полезны. Не позволяйте ему отворачивать вас от сайта. Вы можете счесть полезным прочитать [«Как задать хороший вопрос?»] (Http://stackoverflow.com/help/how-to-ask) и Джон Скит [«Написание идеального вопроса»] (http: //codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/). –

ответ

2

Вы можете использовать StringBuilder и проверить пустые String с с String.isEmpty() как

StringBuilder sb = new StringBuilder(); 
sb.append(string1); 
if (!string2.isEmpty()) { 
    sb.append("~").append(string2); 
} 
if (!string3.isEmpty()) { 
    sb.append("~").append(string3); 
} 
if (!string4.isEmpty()) { 
    sb.append("~").append(string4); 
} 
String phone = sb.toString(); 

, если все строки, но String4 пусты, я получаю: ~ String4. Есть ли способ предотвратить ~ без добавления команд else?

Вы могли создать утилиту (или помощник) метод для join ваших String с как

static void join(StringBuilder sb, String str) { 
    if (!str.isEmpty()) { 
     if (sb.length() > 0) { 
      sb.append('~'); 
     } 
     sb.append(str); 
    } 
} 

, а затем использовать это как

StringBuilder sb = new StringBuilder(string1); 
join(sb, string2); 
join(sb, string3); 
join(sb, string4); 
String phone = sb.toString(); 
+0

Я был слишком поздно! 'StringBuilder' кажется идеальным способом тоже сделать это. –

+0

@AshwinGupta. С потоками Java 8 возможна более сжатая реализация. –

+0

@ ЭндиТомас в порядке, ты только что научил меня чему-то новому сегодня. Я никогда не видел этого раньше. –

1

Если вы используете Java 8, там теперь класс java.util.StringJoiner.

Например:

StringJoiner sj = new StringJoiner("~"); 
if (!string1.isEmpty()) 
    sj.add(string1); 
if (!string2.isEmpty()) 
    sj.add(string2); 
if (!string3.isEmpty()) 
    sj.add(string3); 
if (!string4.isEmpty()) 
    sj.add(string4); 

String desiredString = sj.toString(); 
4

Вам не нужно много кода на всех, если вы используете Java 8 или более поздней версии.

String phones = Stream.of(string1, string2, string3, string4) 
       .filter(s -> ! s.isEmpty()) // Filter out empty strings 
       .collect(Collectors.joining("~")); 

Если у вас есть нулевые значения, вы также можете отфильтровать их.

String phones = Stream.of(string1, string2, string3, string4) 
       .filter(Objects::nonNull) // <-- Filter out nulls 
       .filter(s -> ! s.isEmpty()) 
       .collect(Collectors.joining("~")); 

EDIT: До Java 8

Если вы используете более раннюю версию Java, один подход заключается в определении требуемой операции один раз, а затем вызвать его повторно.

public static void join(StringBuilder sb, String s) { 
    if ((null != s) && ! s.isEmpty()) { 
     if (0 < sb.length()) { 
      sb.append("~"); 
     } 
     sb.append(s); 
    } 
} 

public static void main(String[] args) { 
    StringBuilder sb = new StringBuilder(); 
    String string1 = "foo", string2 = "", string3 = null, string4 = "bar"; 

    join(sb, string1); 
    join(sb, string2); 
    join(sb, string3); 
    join(sb, string4); 

    System.out.println(sb.toString()); 
} 
+0

mind = blown ... не использовали java в то время как кажется –

+0

Потоки иногда могут приводить к сжатому коду, отчасти потому, что вы указываете, что хотите, а не как это сделать. :) –

Смежные вопросы