Есть ли простой способ объединить несколько строк текста в строку без добавления новой строки? - PullRequest
11 голосов
/ 24 марта 2010

Так что мне по сути нужно сделать это:

String text = "line1\n";
text += "line2\n";
text += "line3\n";
useString( text );

Существует больше вовлеченных, но это основная идея. Есть ли что-нибудь, что могло бы позволить мне сделать что-то еще в этом направлении?

DesiredStringThinger text = new DesiredStringThinger();
text.append( "line1" );
text.append( "line2" );
text.append( "line3" );
useString( text.toString() );

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

Спасибо!

Ответы [ 8 ]

15 голосов
/ 24 марта 2010

Вы можете использовать StringWriter, завернутый в PrintWriter:

StringWriter stringWriter = new StringWriter();
PrintWriter writer = new PrintWriter(stringWriter, true);
writer.println("line1");
writer.println("line2");
writer.println("line3");
useString(stringWriter.toString());
8 голосов
/ 24 марта 2010

AFAIK, нет библиотечного класса, который бы позволял вам это делать.

Следующее делает работу, хотя:

class DesiredStringThinger {
  StringBuilder text = new StringBuilder();

  public void append(String s) { text.append(s).append("\n"); }

  @Override
  public String toString() { return text.toString(); }
}
4 голосов
/ 24 марта 2010
public String createString () {
   StringBuilder sb = new StringBuilder ();
   String txt = appendLine("firstline", sb).appendLine("2ndLine", sb).toString();
}

private StringBuilder appendLine (String line, StringBuilder sb) {
   String lsp = System.getProperty("line.separator");
   return sb.append (line).append (lsp);
}
2 голосов
/ 24 марта 2010

Если вы хотите использовать внешние библиотеки, проверьте Joiner в Гуаве.

Ваш код будет выглядеть примерно так:

String result = Joiner.on("\n").join(parts);

, где parts - это Iterable<String>.

2 голосов
/ 24 марта 2010

Вы можете использовать из Apache Commons помощник StringUtils.join. Который позволяет построить строку из списка. Вы можете добавить символ / строку «разделитель».

1 голос
/ 24 марта 2010

Вы можете использовать StringBuffer

StringBuffer text = new StringBuffer();
text.append("line1");  
text.append("line2");  
...  
useString(text.toString());   

Это не добавит символ новой строки, но вы, безусловно, можете добавить это и для каждой строки.

0 голосов
/ 24 марта 2010

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

class DesiredStringThinger {
  StringBuilder sb = new StringBuilder();

  public void concat(String... s) { 
      for(String str : s){
         sb.append(s).append("\n");
      }
  }

  @Override
  public String toString() { 
      return sb.toString();
  }
}
0 голосов
/ 24 марта 2010

Возможно, самый низкий метод воздействия - это добавить статический метод для добавления новой строки к StringBuilder.

 public static StringBuilder appendln(StringBuilder buff, String str) {
     return buff.append(str).append('\n');
 }

Но @Joachim Sauer опережает меня до моего предпочтительного решения. Для более сложных примеров вы можете использовать собственный Writer декоратор, например @Rahul G (используйте только личные поля).

...