2009-02-11 38 views
16

Tôi có chuỗi java, có chuỗi có độ dài thay đổi.Đưa char vào chuỗi java cho mỗi ký tự N

Tôi cần phải đặt đoạn "<br>" vào chuỗi, cho biết mỗi 10 ký tự.

Đối với ví dụ này là chuỗi của tôi:

`this is my string which I need to modify...I love stackoverlow:)` 

Làm thế nào tôi có thể có được chuỗi này ?:

`this is my<br> string wh<br>ich I nee<br>d to modif<br>y...I love<br> stackover<br>flow:)` 

Cảm ơn

Trả lời

20

Cái gì như:

public static String insertPeriodically(
    String text, String insert, int period) 
{ 
    StringBuilder builder = new StringBuilder(
     text.length() + insert.length() * (text.length()/period)+1); 

    int index = 0; 
    String prefix = ""; 
    while (index < text.length()) 
    { 
     // Don't put the insert in the very first iteration. 
     // This is easier than appending it *after* each substring 
     builder.append(prefix); 
     prefix = insert; 
     builder.append(text.substring(index, 
      Math.min(index + period, text.length()))); 
     index += period; 
    } 
    return builder.toString(); 
} 
+0

tuyệt vời và nếu tôi không muốn đặt
trong các từ? ví dụ tránh những thứ như: stackover
luồng và đặt trực tiếp
vào cuối từ? – Giancarlo

+1

Sau đó, đó là một vấn đề khó khăn hơn đáng kể. Biểu thức chính quy * có thể * là cách tốt nhất ở đó, nhưng bạn cần nêu rõ các yêu cầu * rất * chính xác trước tiên. –

+0

một phiên bản ngắn của mã của bạn với regex trong bài đăng này .. http: // stackoverflow.com/questions/10530102/java-parse-string-và-add-line-break-every-100-ký tự – mtk

32

Hãy thử:

String s = // long string 
s.replaceAll("(.{10})", "$1<br>"); 

EDIT: Các tác phẩm trên ... hầu hết thời gian. Tôi đã chơi xung quanh với nó và đã gặp một vấn đề: vì nó xây dựng một Pattern mặc định bên trong nó tạm dừng trên các dòng mới. để giải quyết vấn đề này, bạn phải viết nó theo cách khác.

public static String insert(String text, String insert, int period) { 
    Pattern p = Pattern.compile("(.{" + period + "})", Pattern.DOTALL); 
    Matcher m = p.matcher(text); 
    return m.replaceAll("$1" + insert); 
} 

và trình đọc sắc sảo sẽ gặp vấn đề khác: bạn phải thoát khỏi các ký tự đặc biệt regex (như "$ 1") trong văn bản thay thế hoặc bạn sẽ nhận được kết quả không thể đoán trước.

Tôi cũng tò mò và đánh giá phiên bản này so với Jon ở trên. Điều này là chậm hơn bởi một thứ tự độ lớn (1000 thay thế trên một tập tin 60k mất 4,5 giây với điều này, 400ms với mình). Trong 4,5 giây, chỉ khoảng 0,7 giây đã thực sự xây dựng Mô hình. Hầu hết trong số đó là kết hợp/thay thế, do đó nó thậm chí không dẫn đến loại tối ưu hóa đó.

Tôi thường thích các giải pháp ít phức tạp hơn cho mọi thứ. Sau khi tất cả, thêm mã = ​​lỗi tiềm năng hơn. Nhưng trong trường hợp này tôi phải thừa nhận rằng phiên bản của Jon - đó thực sự là việc thực hiện ngây thơ (tôi có nghĩa là trong một cách tốt nhất cách tốt) - là tốt hơn đáng kể.

+0

tôi nhận được: dãy thoát không hợp lệ (những giá trị được \ b \ t \ n \ f \ r \" \' \ \) cho "(. {1,10} \ s +" –

+0

Đã sửa lỗi. Nó phải là \\ s nhưng tôi đã giả định nhầm rằng bạn muốn phá vỡ ranh giới từ. Bạn không nên làm như vậy ở trên – cletus

1
StringBuilder buf = new StringBuilder(); 

for (int i = 0; i < myString.length(); i += 10) { 
    buf.append(myString.substring(i, i + 10); 
    buf.append("\n"); 
} 

Bạn có thể nhận được hiệu quả hơn thế nữa, nhưng tôi sẽ rời khỏi đó như là một bài tập cho người đọc.

+0

Thiếu một dấu ngoặc đơn sau trên phụ lục đầu tiên, cũng đi ra khỏi giới hạn chuỗi –

+0

Bạn nên có thể sử dụng StringBuilder không phải StringBuffer. – cletus

+0

Đó là loại bài tập tôi để lại cho người đọc. – DJClayworth

0

Làm thế nào về 1 phương pháp để phân chia các chuỗi mỗi N ký tự:

public static String[] split(String source, int n) 
{ 
    List<String> results = new ArrayList<String>(); 

    int start = 0; 
    int end = 10; 

    while(end < source.length) 
    { 
     results.add(source.substring(start, end); 
     start = end; 
     end += 10; 
    } 

    return results.toArray(new String[results.size()]); 
} 

Sau đó, một phương pháp khác để chèn một cái gì đó sau mỗi mảnh:

public static String insertAfterN(String source, int n, String toInsert) 
{ 
    StringBuilder result = new StringBuilder(); 

    for(String piece : split(source, n)) 
    { 
     result.append(piece); 
     if(piece.length == n) 
      result.append(toInsert); 
    } 

    return result.toString(); 
} 
3

Để tránh cắt bỏ những lời ...

Hãy thử:

int wrapLength = 10; 
    String wrapString = new String(); 

    String remainString = "The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog"; 

    while(remainString.length()>wrapLength){ 
     int lastIndex = remainString.lastIndexOf(" ", wrapLength); 
     wrapString = wrapString.concat(remainString.substring(0, lastIndex)); 
     wrapString = wrapString.concat("\n"); 

     remainString = remainString.substring(lastIndex+1, remainString.length()); 
    } 

    System.out.println(wrapString); 
3

Nếu bạn không nhớ một sự phụ thuộc vào một third-party library và không nhớ regexes:

import com.google.common.base.Joiner; 

/** 
* Splits a string into N pieces separated by a delimiter. 
* 
* @param text The text to split. 
* @param delim The string to inject every N pieces. 
* @param period The number of pieces (N) to split the text. 
* @return The string split into pieces delimited by delim. 
*/ 
public static String split(final String text, final String delim, final int period) { 
    final String[] split = text.split("(?<=\\G.{"+period+"})"); 
    return Joiner.on(delim).join(split); 
} 

Sau đó:

split("This is my string", "<br/>", 5); 

này doesn' t tách từ tại không gian nhưng câu hỏi, như đã nêu, không yêu cầu từ bọc.

+1

Trong Java 8, bạn có thể sử dụng 'return String.join (delim, split);' thay vì ổi. – Kapep

0

Tôi đã đơn vị thử nghiệm giải pháp này cho điều kiện biên:

public String padded(String original, int interval, String separator) { 
    String formatted = ""; 

    for(int i = 0; i < original.length(); i++) { 
     if (i % interval == 0 && i > 0) { 
      formatted += separator; 
     } 
     formatted += original.substring(i, i+1); 
    } 

    return formatted; 
} 

Gọi với:

padded("this is my string which I need to modify...I love stackoverflow:)", 10, "<br>"); 
0

Các phương pháp sau đây có ba tham số. Đầu tiên là văn bản mà bạn muốn sửa đổi. Tham số thứ hai là văn bản bạn muốn chèn mỗi n ký tự. Thứ ba là khoảng thời gian mà bạn muốn chèn văn bản vào.

private String insertEveryNCharacters(String originalText, String textToInsert, int breakInterval) { 
    String withBreaks = ""; 
    int textLength = originalText.length(); //initialize this here or in the start of the for in order to evaluate this once, not every loop 
    for (int i = breakInterval , current = 0; i <= textLength || current < textLength; current = i, i += breakInterval) { 
     if(current != 0) { //do not insert the text on the first loop 
      withBreaks += textToInsert; 
     } 
     if(i <= textLength) { //double check that text is at least long enough to go to index i without out of bounds exception 
      withBreaks += originalText.substring(current, i); 
     } else { //text left is not longer than the break interval, so go simply from current to end. 
      withBreaks += originalText.substring(current); //current to end (if text is not perfectly divisible by interval, it will still get included) 
     } 
    } 
    return withBreaks; 
} 

Bạn sẽ gọi phương pháp này như sau:

String splitText = insertEveryNCharacters("this is my string which I need to modify...I love stackoverlow:)", "<br>", 10); 

Kết quả là:

this is my<br> string wh<br>ich I need<br> to modify<br>...I love <br>stackoverl<br>ow:) 

^Đây là khác biệt so với ví dụ của bạn là kết quả bởi vì bạn đã có một thiết lập với 9 ký tự thay vì 10 do lỗi của con người;)

0

Bạn có thể sử dụng cụm từ thông dụng '..' để khớp với hai ký tự và thay thế bằng "$ 0" để thêm khoảng trắng:

s = s.replaceAll ("..", "$ 0"); Bạn cũng có thể muốn cắt kết quả để loại bỏ khoảng trống thừa ở cuối.

Hoặc bạn có thể thêm một sự khẳng định lookahead phủ định để tránh thêm không gian ở phần cuối của chuỗi:

s = s.replaceAll ("?! .. ($)", "$ 0");

Ví dụ:

String s = "23423412342134"; s = s.replaceAll("....", "$0<br>"); System.out.println(s);

Output: 2342<br>3412<br>3421<br>34

Các vấn đề liên quan