# Prüfen, ob ein String eine Binärzahl ist



## districon (27. Apr 2021)

Hallo,
ich will überprüfen ob im String s Binärzahlen enthalten sind. Sollte eine Binärzahl enthalten sein, so soll "Richtig" zurückgegeben werden. Für diese Aufgabe habe ich sogar schon zwei Ansätze. Einmal jedes Element des Strings auslesen (mittels for-Schleife) und schauen ob der Wert 1 oder 0 ist. Meine andere Idee war es die Summe des Strings zu ermitteln. Diese muss ja entweder gleich der Länge des Strings sein (wenn die Binärzahl nur aus 1en besteht) oder kleiner als die Länge. Ich denke aber für mein Problem ist die erste Variante wohl besser. Ich weiß nur noch nicht wie ich das jetzt genau umsetzen soll.
Wichtig zu sagen ist noch, dass ich nur String.length() und String.charAt() verwenden will. 
Ich benötige auf jeden Fall eine If Anweisung. Aber soll dann in der if-Bedingung meine for-Schleife stehen? Oder wie mache ich das genau?
Danke für jede Hilfe,
Gruß


----------



## districon (27. Apr 2021)

```
public class Bin2Long {
    public static int checkInput(String s) {
        if (s == null) {
            return -3;
        } if (s.length() == 0) {
            return -2;
        }
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == 0 || s.charAt(i) == 1) {
                    return -1;
                } else if (s.charAt(i) != 0 || s.charAt(i) != 1) {
                    return i;
                }
            }



    }
}
```

Nun habe ich es doch fast selber herausgefunden. Es kommt aber noch die Fehlermeldung missing return statement. Was muss ich denn jetzt ändern? Statt "Richtig" habe ich jetzt -1 herausgegeben


----------



## GarbageCollector (27. Apr 2021)

```
public static int checkInput(String s) {
        Matcher m = Pattern.compile("[01]+").matcher(s);
        if (m.find()) {
            return Integer.parseInt(m.group(), 2);
        } else {
            return -1;
        }
    }

    public static void main(String[] args) {
        System.out.println(checkInput("hallo100hallo"));
    }
```


----------



## mihe7 (27. Apr 2021)

districon hat gesagt.:


> ob im String s Binärzahlen enthalten sind.


Sobald eine 0 oder eine 1 vorkommt, ist eine Binärzahl enthalten. Wenn der String nur aus 0en und 1en besteht, stellt die Zeichenkette eine Binärzahl dar. Jetzt ist halt nur die Frage, was genau Du brauchst und dann sollte die Umsetzung nicht allzu schwer sein


----------



## districon (27. Apr 2021)

mihe7 hat gesagt.:


> Sobald eine 0 oder eine 1 vorkommt, ist eine Binärzahl enthalten. Wenn der String nur aus 0en und 1en besteht, stellt die Zeichenkette eine Binärzahl dar. Jetzt ist halt nur die Frage, was genau Du brauchst und dann sollte die Umsetzung nicht allzu schwer sein


Hey, erstmal danke für die Antwort. Ich selbst habe nochmal eine Antwort mit meinem bisherigen Code verfasst. Das müsste jetzt so stimmen, nur habe ich ein klein wenig Probleme mit den return Anweisungen


----------



## Corvin697 (27. Apr 2021)

districon hat gesagt.:


> ```
> public class Bin2Long {
> public static int checkInput(String s) {
> if (s == null) {
> ...


Dir fehlt noch ein return Statement vor der vorletzten } (die Klammer, die die Methode schließt. Du fragst in deiner Methode nämlich mehrere Bedingungen mit den if-statements ab, sagst aber nicht, was passieren soll, wenn keines der Statements greift, und das geht nicht.


----------



## Robert Zenz (27. Apr 2021)

So als Notiz, du hast hier ein Problem was das Design deiner Methode angeht. Wenn ein Fehler auftritt, retournierst du "-3", "-2" und "-1" um den Fehler anzuzeigen, aber diese drei Werte sind gueltige Werte welche auftreten koennten beim Input. Geraten "10000000 00000000 00000000 0000001" (oder war's "11111111 11111111 11111111 11111110"?) sollte "-1" ergeben. Damit kannst du beim Aufruf nicht mehr unterscheiden ob es ein gueltiger Wert war oder ein Fehler. Besser waere es damit wenn du hier zum einen eine "IllegalArgumentException" wirfst wenn der Parameter "null" oder  leer war, und zum anderen eine "NumberFormatException" wenn Zeichen enthalten sind welche nicht passen (macht "Integer.parseInt" bereits).

Auszerdem passen deine Namen nicht. "Bin2Long" konvertiert zu "int", "checkInput" prueft nicht nur sondern konvertiert. Benennen von Dingen ist schwierig, aber sehr wichtig wenn sich im Code jemals wieder zu recht finden will.


----------



## mihe7 (27. Apr 2021)

districon hat gesagt.:


> Das müsste jetzt so stimmen, nur habe ich ein klein wenig Probleme mit den return Anweisungen


Geh mal Deine Schleife durch: Du prüfst das erste Zeichen (i==0), wenn dieses erste Zeichen den Codepoint 0 oder 1 hat, gibst Du sofort -1 zurück. Mal abgesehen davon, dass Du nach dem ersten Zeichen sofort aufhörst, prüfst Du Codepoints und keine Zeichen ab. Für Zeichen musst Du mit '0' und '1' (und nicht mit 0 und 1) vergleichen. Im else-Zweig prüfst Du eine Bedingung, die immer wahr ist, denn jedes Zeichen ist entweder von 0 oder von 1 verschieden.

Ich würde sagen: da stimmt eigentlich nix


----------

