2009-02-11 12 views
16

Değişken uzunluğa sahip bir java dizilim var.Her N karakteri için bir java dizesine char ekleme

"<br>" parçasını, her 10 karakterden oluşan bir dizeye koymam gerekiyor. Bu dize ?:

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

Teşekkür elde edebilirsiniz nasıl

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

cevap

20

şey:

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

fantastik!
kelimelerin içine kelimeler eklemek istemiyorum? örnek gibi şeyler kaçınarak:
yığın akışı ve kelimenin sonunda
doğrudan koyarak? – Giancarlo

+1

Ardından bu çok daha zor bir sorundur. Düzenli bir ifade * burada en iyi yol olabilir *, ancak gereklilikleri belirtmeniz gerekir * çok * önce tam olarak. –

+0

Bu yazı içinde regex ile kodunuzun kısa bir sürümü .. http: // stackoverflow.com/questions/10530102/java-parse-string-ve-add-line-break-her-100-karakterleri – mtk

32

Dene: Örneğin

bu benim dizedir

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

DÜZENLEME: Yukarıdaki işler ... çoğu zaman. Bununla oynamaktayım ve bir problemle karşılaştım: dahili bir şekilde varsayılan bir model oluşturduğundan, yeni satırlarda durur. Bu etrafında almak için farklı yazmanız gerekir.

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); 
} 

ve zeki okuyucu başka sorun üzerinde gelip alacak: Eğer yedek metninde ("$ 1" gibi) normal ifadedeki özel karakterlerden kurtulmak zorunda veya öngörülemeyen sonuçlar alırsınız.

Bu versiyonda Jon'un yukarıda yazdığı şeye karşı meraklı ve karşılaştırmalıyım. Bu bir büyüklük sırasına göre daha yavaştır (60k dosyadaki 1000 yedek, bununla 4.5 saniye sürdü, onunla 400 ms). 4.5 saniyenin sadece yaklaşık 0,7 saniyesi aslında Deseni oluşturuyordu. Çoğu eşleşme/değiştirme üzerindeydi, bu yüzden kendini bu tür bir optimizasyona bile götürmedi.

Normalde işler için daha az endişeli çözümleri tercih ederim. Sonuçta, daha fazla kod = daha fazla potansiyel hata. Ama bu durumda Jon'un versiyonunun - ki bu gerçekten saf uygulama (yani iyi bir şekilde) - önemli ölçüde daha iyi olduğunu kabul etmeliyim. gibi

+0

alıyorum: Geçersiz çıkış sırası (geçerli olanlar "B \ t \ n \ f \ r \ \ olan \' \ \) için "(. {1,10} \ s +" –

+0

Düzeltildi. \\ s olmalıydı ama yanlışlıkla kelime sınırlarını kırmak istediğini varsayıyordum. – 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"); 
} 

Bundan fazla verimli alabilirsiniz, ama ben okuyucuya alıştırma olarak o bırakacağım. yaklaşık 1 metod dize bölmek nasıl

+0

İlk eki üzerinde bir sondaki paren eksik, aynı zamanda –

+0

dize sınırlarını dışarı gidiyor muhtemelen StringBuilder değil StringBuffer kullanın. – cletus

+0

Bu, okuyucu için bıraktığım egzersiz türüdür. – DJClayworth

0

her N karakterler:

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()]); 
} 

Sonra başka yöntem her parça sonra bir şeyler eklemek için:

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

kelimeleri kesen önlemek için ...

Dene:

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

Bir third-party library bir bağımlılık umursamıyorum ve regexes sakıncası yoksa: Sonra

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); 
} 

:

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

Bu kötü kokan kelimeleri boşluklarda bölme, ancak belirtildiği gibi, soru, kelime sarma istemez.

+1

Java 8'de 'return String.join (delim, split);' guava yerine 'kullanabilirsiniz. – Kapep

0

Ben birim sınır koşulları için bu çözümü test ettik:

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; 
} 

Çağrı ile:

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

aşağıdaki yöntem üç parametre alır. İlki değiştirmek istediğiniz metin. İkinci parametre, her n karakteri eklemek istediğiniz metindir. Üçüncü, metni eklemek istediğiniz aralıktır.

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

sonucudur:

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öyle bu yönteme çağırır

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

^Bu 9 karakterlerle bir dizi vardı çünkü örnek sonuçlanabilir farklıdır İnsan hatası nedeniyle 10 yerine;)

0

Her ikisine eşleştirmek için '..' düzenli ifadesini kullanabilirsiniz. karakterleri ekleyin ve alanı eklemek için "$ 0" ile değiştirin:

s = s.replaceAll ("..", "$ 0"); Ayrıca, sondaki fazla boşluğu kaldırmak için sonucu kırpmak isteyebilirsiniz.

Alternatif dizesinin sonunda boşluk ekleyerek önlemek için bir negatif ileri yönlü belirtilme ekleyebilirsiniz:

s = s.replaceAll ("?! .. ($)", "$ 0"); Örneğin

:

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

Çıktı: 2342<br>3412<br>3421<br>34