# Schleifen und Strings



## bozz03 (24. Nov 2015)

1.


> Erstellen Sie einen neuen String, der aus der ursprünglichen Zeichenkette (str) besteht, die (times) mal aneinander gehängt wurde. Sie den neuen String zurück.



Das ist die Aufgabenstellung
Wir müssen das mit einer Schleife machen. Meine Lösung wird getestet mit JUnit.


```
package de.hs_weingarten.progp.uebung3.schleifen;

public class StrConcatTimes {

    public static String strConcatTimes(String str, int times) {

        int grenze = times - 1;

        for (int i = 1; i <= grenze; i++)
            str = str + str;
        return str;
```

Ich bekomme den Fehler nicht raus und komme nicht weiter
2.


> Geben Sie eine neue Zeichenkette zurück, die gleich str ist, jedoch soll
> die neue Zeichenkette keine direkt aufeinanderfolgende doppelten
> Buchstaben enthalten.
> Gehen Sie str Zeichen für Zeichen durch und nutzen Sie dazu wieder
> ...


Wie oben auch wird meine Lösung mit JUnit getestet.

```
public static String strReplaceDuplicate(String str) {

        for (int i = 0; i <= str.length() - 1; i++)
            if (str.charAt(i) == str.charAt(i) + 1)
                str = str.replaceAll(str.charAt(i), "");

        return str;
```
 
Das funktioniert leider nicht weil er mir bei str = str.replaceAll(str.charAt(i), ""); ein Fehler ausspuckt das ich das so nicht machen darf.

Wäre für eure Hilfe dankbar


----------



## Joose (24. Nov 2015)

Gewöhne dir an bei Schleifen und if-Bedingungen Klammern zu verwenden. Auch wenn diese vom Compiler bei einzeiligen nicht verlangt werden.
Dadurch minimierst du eine potenzielle Fehlerquelle  (ein passender Artikel dazu: http://www.spiegel.de/netzwelt/web/goto-fail-apples-furchtbarer-fehler-a-955154.html)




bozz03 hat gesagt.:


> Ich bekomme den Fehler nicht raus und komme nicht weiter



Welchen Fehler denn?
Welches Ergebnis erwartest du, welches Ergebnis bekommst du?



bozz03 hat gesagt.:


> Das funktioniert leider nicht weil er mir bei str = str.replaceAll(str.charAt(i), ""); ein Fehler ausspuckt das ich das so nicht machen darf.



Hier wäre es ganz praktisch wenn du uns verraten würdest welcher Fehler ausgespuckt wird 


Mit etwas mehr Informationen kann man dir sicher schnell helfen


----------



## Joose (24. Nov 2015)

Tipp zu 1:
Lass dir nach jedem Schleifendurchlauf den Wert von "str" ausgeben und überlege dann warum es nicht klug ist den zusammengehängten Wert wieder der Variable "str" zuzuweisen 

Tipp zu 2:
Dokumentation lesen http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
Die Methode replaceAll erwartet 2 Strings als Parameter du lieferst char und string. Deswegen wird sich der Compiler beschweren.
Außerdem wirst du mit dieser Variante zuviel löschen -> replaceAll ersetzt alle Vorkommen! Egal wo du mit "charAt" gerade bist.


----------



## bozz03 (24. Nov 2015)

Zu Aufgabe 1:
Ich soll den String H 3x mal hintereinander hängen damit HiHiHi rauskommt bei mir kommt HiHiHiHi raus d.h 1x Hi zuviel


Zu AUfgabe 2:


> the method replaceAll(String, String) in the type String is not applicable for the type for the argument (char,String)



EDIT:
1.Ich füge einmal zuviel String hinzu aber ich hab keine Ahnung wie ich das beheben kann.

2. kann ich nur mit replace arbeiten? und wie wandle ich den char in ein String um?


----------



## Joose (24. Nov 2015)

Zu beiden Aufgaben habe ich dir oben noch Tipps dazugeschrieben, bitte mal durchlesen ausprobieren und dann nochmal deine Antwort hier posten


----------



## strußi (24. Nov 2015)

du sollst eine String str n-mal aneinander hängen? 
String neu ="";
for( int i =0; i <n; i++){
 neu =neu.concat( str);
}


----------



## Joose (24. Nov 2015)

bozz03 hat gesagt.:


> Zu Aufgabe 1:
> Ich soll den String H 3x mal hintereinander hängen damit HiHiHi rauskommt bei mir kommt HiHiHiHi raus d.h 1x Hi zuviel
> 
> 1.Ich füge einmal zuviel String hinzu aber ich hab keine Ahnung wie ich das beheben kann.



Deswegen auch mein Tipp, dir bei jedem Schleifendurchlaufen den Wert von "str" ausgeben zu lassen.
Aber strußi hat dir leider schon die Lösung verraten 



bozz03 hat gesagt.:


> 2. kann ich nur mit replace arbeiten? und wie wandle ich den char in ein String um?


Nein replace ist auch die falsche Variante. Wie man einen char in String umwandelt kann man in Grundlagenbücher oder per Google gut finden (-> Eigeninitiative).


----------



## bozz03 (24. Nov 2015)

Vielen Dank strußi
hab sowas in der Art versucht nur das ich ein falschen benutzen namen str gewählt habe


----------



## strußi (24. Nov 2015)

@Joose im sooooooo sorry


----------



## bozz03 (24. Nov 2015)

Bei der zweiten Aufgabe komme ich trotzdem nicht weiter. Hocke schon seit paar Stunden drauf. Habt ihr Tipps für mich wie ich drauf kommen könnte? (Artikel in Deutsch bitte)

sowas wie deleteCharAt gibt es nicht oder?


----------



## Joose (24. Nov 2015)

Mache es doch ähnlich wie bei Aufgabe 1.
Anstatt bei deinem Start String etwas zu löschen baue dir doch einen neuen zusammen indem du char für char hinten anfügst.
Natürlich dabei überprüfen das keine doppelten angefügt werden (zählervariable erhöhen)


----------



## bozz03 (24. Nov 2015)

```
public static String strReplaceDuplicate(String str) {
        String neu = "";
        for (int i = 0; i == str.length() - 1; i++) {
            if (str.charAt(i) != str.charAt(i + 1)) {
                neu = new StringBuffer().append(str.charAt(i)).toString();
            }
        }
        return neu;

    }
}
```
Also das zweite l von Hallo wird weggelassen, aber neu besteht nur aus einem buchstaben (verständlich).
Bin dennoch auf dem Holzweg oder? Hocke solang schon vor dem PC und check es immernoch nicht 

Edit:Falscher Code


----------



## Joose (25. Nov 2015)

Naja du musst natürlich schon dafür sorgen das der bisherige Wert von "neu" nicht verloren geht.
Wie hast du es denn bei Aufgabe 1 geschafft das der bisherige Wert nicht verloren geht und du immer wieder was dranhängen kannst?


----------

