Question

J'ai un gros bloc de texte (plus de 200 caractères dans une chaîne) et j'ai besoin d'insérer de nouvelles lignes à l'espace suivant après 30 caractères, afin de préserver les mots. Voici ce que j'ai maintenant (ne fonctionne pas):

String rawInfo = front.getItemInfo(name);
String info = "";
int begin = 0;
for(int l=30;(l+30)<rawInfo.length();l+=30) {
    while(rawInfo.charAt(l)!=' ')
        l++;
    info += rawInfo.substring(begin, l) + "\n";
    begin = l+1;
    if((l+30)>=(rawInfo.length()))
        info += rawInfo.substring(begin, rawInfo.length());
}

Merci pour toute aide

Était-ce utile?

La solution

Comme suggéré par kdgregory, utilisez un StringBuilder serait probablement un moyen plus simple de manipuler des chaînes.

Comme je ne savais pas trop si le nombre de caractères avant la nouvelle ligne est inséré est le mot avant ou après 30 caractères, j'ai choisi le mot après 30 caractères, car la mise en œuvre est probablement plus facile.

L’approche consiste à rechercher l’instance du " "" apparaissant au moins 30 caractères après le caractère en cours d'affichage à l'aide de StringBuilder.indexOf . Lorsqu'un espace apparaît, un \ n est inséré par StringBuilder.insert .

(Nous supposerons qu'un retour à la ligne est \ n ici - le séparateur de lignes utilisé dans l'environnement actuel peut être récupéré par System.getProperty (" line.separator " ); ).

Voici l'exemple:

String s = "A very long string containing " +
    "many many words and characters. " +
    "Newlines will be entered at spaces.";

StringBuilder sb = new StringBuilder(s);

int i = 0;
while ((i = sb.indexOf(" ", i + 30)) != -1) {
    sb.replace(i, i + 1, "\n");
}

System.out.println(sb.toString());

Résultat:

A very long string containing many
many words and characters. Newlines
will.

Je dois ajouter que le code ci-dessus n'a pas été testé, à l'exception de l'exemple String que j'ai présenté dans le code. Il ne serait pas surprenant que cela ne fonctionne pas dans certaines circonstances.

Modifier

La boucle de l'exemple de code a été remplacée par une boucle while plutôt que par une boucle pour qui n'était pas très appropriée dans cet exemple.

De même, le StringBuilder.insert a été remplacé par la méthode StringBuilder.replace , comme le disait Kevin Stich dans les commentaires la méthode replace a été utilisée à la place de insert pour obtenir le comportement souhaité.

Autres conseils

Voici une solution testée.

import junit.framework.TestCase;

public class InsertLinebreaksTest extends TestCase {
    public void testEmptyString() throws Exception {
        assertEquals("", insertLinebreaks("", 5));
    }

    public void testShortString() throws Exception {
        assertEquals("abc def", insertLinebreaks("abc def", 5));
    }

    public void testLongString() throws Exception {
        assertEquals("abc\ndef\nghi", insertLinebreaks("abc def ghi", 1));
        assertEquals("abc\ndef\nghi", insertLinebreaks("abc def ghi", 2));
        assertEquals("abc\ndef\nghi", insertLinebreaks("abc def ghi", 3));
        assertEquals("abc def\nghi", insertLinebreaks("abc def ghi", 4));
        assertEquals("abc def\nghi", insertLinebreaks("abc def ghi", 5));
        assertEquals("abc def\nghi", insertLinebreaks("abc def ghi", 6));
        assertEquals("abc def\nghi", insertLinebreaks("abc def ghi", 7));
        assertEquals("abc def ghi", insertLinebreaks("abc def ghi", 8));
    }

    public static String insertLinebreaks(String s, int charsPerLine) {
        char[] chars = s.toCharArray();
        int lastLinebreak = 0;
        boolean wantLinebreak = false;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < chars.length; i++) {
            if (wantLinebreak && chars[i] == ' ') {
                sb.append('\n');
                lastLinebreak = i;
                wantLinebreak = false;
            } else {
                sb.append(chars[i]);
            }
            if (i - lastLinebreak + 1 == charsPerLine)
                wantLinebreak = true;
        }
        return sb.toString();
    }
}

Une meilleure solution: copiez la chaîne dans un StringBuilder pour pouvoir insérer / modifier des caractères sans beaucoup de sous-chaîne. Utilisez ensuite la méthode indexOf () qui prend une position de départ pour rechercher l’index à modifier.

Modifier: le code:

public static String breakString(String str, int size)
{
    StringBuilder work = new StringBuilder(str);
    int pos = 0;
    while ((pos = work.indexOf(" ", pos + size)) >= 0)
    {
        work.setCharAt(pos, '\n');
    }
    return work.toString();
}

Je voudrais parcourir la chaîne au lieu de 30. Vous devez suivre les 30 si.

psuedocode parce que cela ressemble à un devoir:

charInLine=0
iterateOver each char in rawString
    if(charInLine++ > 30 && currChar==' ')
        charInLine=0
        currChar='\n'

Peut-être que je manque quelque chose. Quel est le problème avec

String s = ... s = sous-chaîne (0, 30) + sous-chaîne (30) .remplacer ('', '\ n');

Ceci remplace tous les espaces par des nouvelles lignes commençant après le caractère 30.

C’est un peu moins efficace, mais pour 200 caractères, cela n’importe vraiment pas (c’est extrêmement petit pour la manipulation de données).

Bruce

    String s = "A very long string containing " +
"many many words and characters. " +
"Newlines will be entered at spaces.";
StringBuilder sb = new StringBuilder(s);
int i = 0;
while ((i = sb.indexOf(" ", i + 30)) != -1) {
    sb.replace(i, i + 1, "\n");
}
System.out.println(sb.toString());

c’est la bonne réponse que j’ai aussi essayée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top