# Leerzeichen zwischen jeden Buchstaben eines Strings einfügen



## fhaslbs (2. Nov 2010)

Hallo erstmals. Ich bin ein 1.Lehrjahr Informatiker, und habe noch nicht viel Erfahrung mit Java. Ich bekam von meinem Chef den Auftrag, mit Java eine Anwendung zu entwicklen, die ein Textfile importiert, und dann zwischen jeden buchstaben der wörter im String ein beliebiges Zeichen einstzt. 
hier der Code:
[Java]
import java.io.BufferedReader;//input eingabe
import java.io.File;//Die Klasse bietet eine große Anzahl von Methoden an, um Informationen über eine Datei oder ein Verzeichnis zu erhalten.
import java.io.FileReader;//Der FileReader liest aus Dateien entweder einzelne Zeichen, Strings oder Zeichenfelder. Wie beim Writer deklariert die Klasse Konstruktoren zur Annahme des Dateinamens. So zeigt folgendes Beispiel eine Anwendung der FileReader-Klasse.
import java.io.FileNotFoundException;//Öffnet die Datei zum Lesen über ein File-Objekt. Falls sie nicht verfügbar ist, löst der Konstruktor eine FileNotFoundException aus.
import java.io.FileWriter;
import java.io.IOException;//fehlerbehandlung
import java.iutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;

public class badwordfilter
{
    public static void main(String[] args) throws IOException
    {
        File Textdatei = new File("c://Program Files/Java/eclipse/BWF_Liste.txt");//zu lesende Textdatei
        StringBuffer contents = new StringBuffer();//Kontainer, in dem die Datei abgelegt werden soll
        BufferedReader reader = null;//bedeutet, dass noch auf kein objekt vorhanden ist

        try//versuche:
        {
            reader = new BufferedReader(new FileReader(Textdatei));
            String text = null;//versuche so lange zu lesen bis


            while ((text = reader.readLine()) != null)//alle linien gelesen sind.
            {
                contents.append(text)
                    .append(System.getProperty(
                        "line.separator"));
            }
        } catch (FileNotFoundException e)//Fange fehlermeldung auf
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        } finally//schlussendlich
        {
            try//Versuche
            {
                if (reader != null)//wenn gelesenes nciht gleich null
                {
                    reader.close();//schliesse reader
                }
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }

        // erbebniss
        System.out.println(contents.toString());







          FileWriter writer;
          File file;


            // File anlegen
             file = new File("d://bwf/test.txt");
             try {
               // new FileWriter(file ,true) - falls die Datei bereits existiert
               // werden die Bytes an das Ende der Datei geschrieben

               // new FileWriter(file) - falls die Datei bereits existiert
               // wird diese überschrieben
               writer = new FileWriter(file ,true);

               // Text wird in den Stream geschrieben
               writer.write(contents.toString());

               // Platformunabhängiger Zeilenumbruch wird in den Stream geschrieben
               writer.write(System.getProperty("line.separator"));


               // Schreibt den Stream in die Datei
               // Sollte immer am Ende ausgeführt werden, sodass der Stream 
               // leer ist und alles in der Datei steht.
               // Text wird in den Stream geschrieben
               writer.write(contents.toString());
               writer.flush();

               // Schließt den Stream
               writer.close();
            } catch (IOException e) {
              e.printStackTrace();
            }
          }

        }
    [/code]

der String wird schon mal in die Datei geschrieben, das sieht dann etwa so aus:

wort1
wort2
wort3
wort4

Die Wörter müssen schlussendlich Kommagetrennt sein, und eben mit beliebigen Zwischenzeichen "gefüllt" sein, also etwa so

w*o*r*t*1,
w*o*r*t*2,
w*o*r*t*3,

wie mache ich das? mit einer speziellen for-Schleife? Das Proglem ist, der Replace befehl bringt mir ja nichts, weil ja nichts ersetzt wird, sondern neu eingefügt wird ???:L
Und wie erkennt Mr. Java, dass jetzt ein neues Wort beginnt, und es zwischen den Wörtern keine Zeichen legen darf? denn die Wörter sind nicht alle gleich lang...


----------



## ARadauer (2. Nov 2010)

also grundsätzlich so in die richtung, wie du das jetzt am besten mit leerzeichen zwischen den wörtern machst, kommt nochmal auf die genau aufgabenstellung an...

```
import java.io.IOException;

public class Test {

   public static void main(String[] args) throws IOException {
      String input = "Ich hab noch nie gesehen, dass jemand Imports kommentiert.";
      String output = "";
      for (int i = 0; i < input.length(); i++) {
         if(input.charAt(i) != ' '){
            output += input.charAt(i)+"*";
         }else{
            output += input.charAt(i);
         }
      }
      System.out.println(output);

   }
}
```


----------



## DerEisteeTrinker (2. Nov 2010)

ich würde das wie folgt machen:


```
public static void main(String[] args) {
	StringBuffer sb = new StringBuffer("Wir räumen die Kette mal von hinten auf.");
	
	for (int i = sb.length() - 1; i >= 0; i--) {
		if (sb.charAt(i) != ' ') {
			sb.insert(i, ' ');
		}
	}
	
	System.out.println(sb.toString());
}
```


----------



## Landei (2. Nov 2010)

ARadauers Lösung ist OK, aber man sollte in ernsthaftem Code einen StringBuilder zum Zusammensetzen verwenden, und den erst am Ende in einen String umwandeln. Generell sollte man vermeiden, Strings im Inneren einer Schleife zusammenzufügen (sofern man nicht weiß, dass es wirklich nur ein paar wenige Durchläufe sind).

[Edit]
@Eisteetrinker: Hübsche Lösung!


----------



## DerEisteeTrinker (2. Nov 2010)

@Landei

Danke


----------



## fhaslbs (8. Nov 2010)

Vielen Dank euch beiden, nun funkt es ziemlich gut =)

ähnliche frage: wie bringe ich eine bestimmte zeichenkette vor und hinter jedes wort eines Strings?
mein beispiel
[java=42]
String eingelesenes =(contents.toString());
        String vorstring="(?i)\b";
        String nachstring="\b";
        eingelesenes+=vorstring+eingelesenes+nachstring;
[/code]

das Ergebniss sollte schlussendlich so aussehen
(?i)bapfel\b
(?i)bbanane\b
usw...

es wird überhaupt nichts spannendes ausgedrücht, weder vor noch nach dem String, und schon gar nicht vor und nach den einzelnen Wörtern ;(

hat jemand Ideen?


----------



## Andi_CH (8. Nov 2010)

Wo ist dein Problem??????


```
public class StringTest {
	private static String test(String pEingabe) {
		String eingelesenes = pEingabe;
		String vorstring="(?i)\b";
		String nachstring="\b";
		eingelesenes+=vorstring+eingelesenes+nachstring;
		return eingelesenes;
	}
	public static void main(String[] args) {
		System.out.println(test("Blabla"));
	}
}
```

output: Blabla(?i)Blabla

Du musst selbst wissen was \b machen soll - ich weiss es nicht, aber es überrascht mich nicht, dass das im output nicht richtig dargestellt wird .....


----------



## fhaslbs (8. Nov 2010)

das Problem ist, das der String aus mehreren unter einander stehenden Wörtern besteht, das input file sieht z.B so aus:

banane
apfel
kartoffeln

das zeugs, was auf dem Bildschirm erscheint ist irelevant, der Text soll(te) in ein textfile geschrieben werden, funktioniert sogar. 
hier nochmals der ganze aktuelle code:

[JAVA=42]
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

public class badwordfilter
{
    public static void main(String[] args) throws IOException
    {
        File Textdatei = new File("C:/Users/User/Desktop/BWF_Liste.txt");
        StringBuffer contents = new StringBuffer();
        BufferedReader reader = null;
        try
        {
            reader = new BufferedReader(new FileReader(Textdatei));
            String text = null;

            while ((text = reader.readLine()) != null)//
            {
                contents.append(text)
                    .append(System.getProperty(
                        "line.separator"));

            }
        } catch (FileNotFoundException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                if (reader != null)
                {
                    reader.close();
                }
            } catch (IOException e)
            {
                e.printStackTrace();
            }
            System.out.println(contents.toString());
        } 
        String eingelesenes =(contents.toString());
        String vorstring="(?i)\b";
        String nachstring="\b";
        eingelesenes+=vorstring+eingelesenes+nachstring;

          FileWriter writer;
          File file;
             file = new File("d://bwf/BWF_new.txt");
             try { 
               writer = new FileWriter(file ,true);
               writer.write(eingelesenes);             
               writer.flush();
               writer.close();
               }       
            catch (IOException e) {
              e.printStackTrace();
            }
            System.out.println(contents.toString());
    }
}


[/code]


----------



## bone2 (8. Nov 2010)

ich denke split() ist was du suchst um jeden string aus einemr langen zeichenkette zu holen, dann mit for über jeden rübergehen und vorne und hinten was anhängen

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 4.7 Zerlegen von Zeichenketten


----------



## Michael... (8. Nov 2010)

Du liest die Datei ja bereits zeilenweise ein. Warum hängst das Ganze nicht gleich direkt beim Einlesen vor und hinter die Zeile?


----------



## fhaslbs (8. Nov 2010)

an welcher stelle genau? entschuldigung für die dumme frage, aber ich bin noch ein ziemlicher Anfänger.


----------



## Andi_CH (8. Nov 2010)

fhaslbs hat gesagt.:


> das Problem ist, das der String aus mehreren unter einander stehenden Wörtern besteht, das input file sieht z.B so aus:
> 
> banane
> apfel
> ...



Grummel - mein Code ist nur dazu da zu beweisen, dass das was du machst schon mal richtig ist. Falls dein Problem an einem anderen Ort ist, hast du es vermutlich zu wenig genau beschrieben!


----------



## Michael... (8. Nov 2010)

fhaslbs hat gesagt.:


> an welcher stelle genau?


Ist der Code von Dir?


fhaslbs hat gesagt.:


> ```
> while ((text = reader.readLine()) != null)//
> {
> contents.append(text).append(System.getProperty("line.separator"));
> ...


----------



## Andi_CH (8. Nov 2010)

fhaslbs hat gesagt.:


> an welcher stelle genau? entschuldigung für die dumme frage, aber ich bin noch ein ziemlicher Anfänger.



[FRUSTMODE]
Warum meinen alle sie seien so ziemlich Anfänger und versuchen nicht mal den Code zu verstehen den sie als ihren eigenen hinstellen????
[/FRUSTMODE]
Ich bin auch ziemlicher Anfänger - ich programmiere Java erst seit Mai 2010.

Hast du keinen Debugger? Ich verwende den immer wenn ich ein Programm nicht verstehe.


----------



## fhaslbs (8. Nov 2010)

@andi_ch 
danke für deine Hilfe, und kom runter^^ Glaubst du, ich würde Java programmieren, wenn ich es nicht lernen möchte?
ja ich verwende einen Debuger, und nein der Code ist nicht von mir, und ich verstehe ihn noch nicht richtig, was nicht heisst, dass ich ihn nicht verstehen möchte. habe ich irgend wo geschrieben, dass der Code mein eigener ist???

@Michael 
Danke, das kommt der Sache schon näher.


----------



## Andi_CH (8. Nov 2010)

Dann step mit dem Debugger durch - dann findest du doch sicher raus wo der Code rein muss.

Ich sags sehr direkt - Deine Art der Fragerei heisst IMHO übersetzt - gebt mir die Lösung dann lasse ich euch in Ruhe.


----------



## nrg (8. Nov 2010)

fhaslbs hat gesagt.:


> [Java]
> import java.io.FileNotFoundException;//Öffnet die Datei zum Lesen über ein File-Objekt. Falls sie nicht verfügbar ist, löst der Konstruktor eine FileNotFoundException aus.
> [/Java]



für die Kommentierung gehören dem Ersteller des Codes die Finger abgehackt :lol:


----------

