# Java Programm, das ein zufälligen String erzeugt [A-Z]



## matthias87 (4. Apr 2015)

Hi Leute,
ich bin neu im Forum und habe eine Aufgabe, mit der ich einige Probleme habe.
Bin im Bereich Java Programmierung Anfänger.

Meine Aufgabe:
Ich soll ein Java-Programm schreiben, welches den String "ABCDEFGHIJKLMNOPQRSTUVWXYZ" bei jedem Programmstart zufällig ausgibt.
z.B. so:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
DNWZCRFKSHVMIYALUXOGJEPTBQ

Das ganze soll mit SecureRandom gemacht werden, aus Sicherheitsgründen.

Habe mit der NetBeans IDE folgendes Programm geschrieben:

```
package zufallstring;
import java.security.SecureRandom;

public class Zufallstring {
    
    public static void main(String[] args) {
        static final String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        static SecureRandom rnd = new SecureRandom();
            
        String randomString( int len )
        {
            StringBuilder sb = new StringBuilder( len );
            for( int i = 0; i < len; i++ ) 
                sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
            return sb.toString();
        }
        System.out.println(AB);
        // Ausgabe des zufaelligen Strings
        
    }  
}
```


Wie gebe ich jetzt den zufaelligen String aus und habe noch diese Fehlermeldung:
illegal start of expression in der Zeile --> static final String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Wer kann mir helfen? Ich komme einfach nicht weiter.
Vielen Dank.


----------



## javampir (4. Apr 2015)

hi,
innerhalb einer statischen methode kannst du keine variable als statisch deklarieren
javampir


----------



## matthias87 (4. Apr 2015)

wie mache ich das denn dann?
warum geht nicht einfach String AB = "ABC.......Z";
kann ich das static einfach vorne weglassen?


----------



## Saheeda (4. Apr 2015)

@matthias87

Alles, was du innerhalb der Methode deklarierst, ist auch nur innerhalb der Methode gültig. Der Kontext, d.h. ob statisch oder nicht-statisch, wird also bereits durch die Methode selbst vorgegeben. 
Du brauchst also nur schreiben String AB = "AB...";


----------



## matthias87 (4. Apr 2015)

Habe jetzt folgendes gemacht:

```
package zufallstring;
import java.security.SecureRandom;

public class Zufallstring {
    
    public static void main(String[] args) {
        String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        SecureRandom rnd = new SecureRandom();
            
        String randomString( int len )
        {
            StringBuilder sb = new StringBuilder( len );
            for( int i = 0; i < len; i++ ) 
                sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
            return sb.toString();
        }
        System.out.println(AB);
        // Ausgabe des zufaelligen Strings
        
    }  
}
```

In der Zeile --> String randomString( int len ) { ....
kommt jetzt folgende Fehlermeldung: ';' expected
Ich sehe keinen Fehler.


----------



## Saheeda (4. Apr 2015)

Methoden in Methoden deklarieren geht nicht. Schreib das außerhalb der main-Methoden.


----------



## matthias87 (4. Apr 2015)

Ok, habe das jetzt so wie du das gesagt hast gemacht:

```
package zufallstring;
import java.security.SecureRandom;

public class Zufallstring {
    
    String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    SecureRandom rnd = new SecureRandom();
    String randomString(int len)
    {
            StringBuilder sb = new StringBuilder(len);
            for( int i = 0; i < len; i++ ) 
                sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
            return sb.toString();
    }
    
    public static void main(String[] args) {
        
        System.out.println(AB);
        // Ausgabe des zufaelligen Strings
        
    }   
}
```

Wie gebe ich das denn jetzt in der Main-Methode an, damit er das ausgibt?
Habe folgende Fehlermeldung: non-static variable AB cannot be referenced from a static context

Ich will folgende Ausgabe:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
DNWZCRFKSHVMIYALUXOGJEPTBQ

Dann bin ich fertig.


----------



## matthias87 (4. Apr 2015)

Habe die Variablen Deklaration auch außerhalb der main-Methode gemacht, weil er das sonst nicht kennt.


----------



## Saheeda (5. Apr 2015)

Variablenscopes:
Variable Scope
Rheinwerk Computing :: Java ist auch eine Insel – 2.4 Blöcke, Initialisierung und Sichtbarkeit

Aufruf.
So:

```
public class Zufallstring {
 
    String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    SecureRandom rnd = new SecureRandom();
    String randomString(int len)
    {
            StringBuilder sb = new StringBuilder(len);
            for( int i = 0; i < len; i++ ) 
                sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
            return sb.toString();
    }
 
    public static void main(String[] args) {
 
        Zufallstring zufallString = new Zufallstring();
       String zufall= zufallstring.randomString(5);
        
      System.out.println(zufall);
        // Ausgabe des zufaelligen Strings
 
    }   
}
```

oder:


```
public class Zufallstring {
 
    static String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    static SecureRandom rnd = new SecureRandom();
    static String randomString(int len)
    {
            StringBuilder sb = new StringBuilder(len);
            for( int i = 0; i < len; i++ ) 
                sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
            return sb.toString();
    }
 
    public static void main(String[] args) {
 
       String zufall= randomString(5);
        
      System.out.println(zufall);
        // Ausgabe des zufaelligen Strings
 
    }   
}
```


----------



## matthias87 (5. Apr 2015)

Das ist super vielen Dank.

Habe noch eine letzte Frage. mit randomString(5) bekomme ich 5 Zeichen. Wenn ich 26 mache, bekomme ich z.B. das hier:
YAFOXUPYDTNBQCOKZWNSRZDQCZ

Wie man sieht tauchen dort einige Zeichen mehrfach auf. Ein Zeichen soll aber nur einmal vorkommen.
Also A-Z soll in gemischter und zufälliger Reihenfolge stehen.
Was habe ich falsch gemacht?

Edit:
Ich habe jetzt
String zufall = randomString(AB.length());
gemacht, damit ich die komplette Länge von AB habe.


----------



## DrZoidberg (5. Apr 2015)

Wenn du zufällig Buchstaben aus einem String nimmst, können natürlich auch welche doppelt vorkommen.
Du müsstest die Buchstaben, die du schon verwendet hast aus AB entfernen.

```
char c = AB.charAt(rnd.nextInt(AB.length()));
sb.append(c);
AB = AB.replace("" + c, "");
```

Aber du könntest statt dessen auch erst mal alle Buchstaben von A - Z mischen und dann von dem Ergebnis die ersten x Buchstaben nehmen.
Mischen kann man z.B. so

```
static void shuffle(char[] a) {
  for(int i = a.length - 1; i > 0; i--) {
    int j = rnd.nextInt(i + 1);
    char c = a[i]; a[i] = a[j]; a[j] = c;
  }
}
```


----------



## Saheeda (5. Apr 2015)

Du kannst z.B. nachdem ein Buchstabe ausgewürfelt wurde diesen aus dem String AB entfernen.


----------



## matthias87 (5. Apr 2015)

Sorry, bin neu in Java.
Habe das so gemacht:


```
package zufallstring;
import java.security.SecureRandom;

public class Zufallstring {
    
    static String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    static SecureRandom random = new SecureRandom();
    static String randomString(int len) {
        StringBuilder sb = new StringBuilder(len);
        //for(int i=0; i < len; i++)
            //sb.append(AB.charAt(random.nextInt(AB.length())));
            char c = AB.charAt(random.nextInt(AB.length()));
            sb.append(c);
            AB = AB.replace("" + c, "");
        return sb.toString();
    }
    
    public static void main(String[] args) {
        System.out.println(AB);
        String zufall = randomString(AB.length());
        System.out.println(zufall);
    }
}
```

Ich bekomme jetzt als Ausgabe einen zufälligen Buchstaben:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
C
oder
ABCDEFGHIJKLMNOPQRSTUVWXYZ
G
oder
ABCDEFGHIJKLMNOPQRSTUVWXYZ
K

usw.
Was muss ich machen?


----------



## matthias87 (5. Apr 2015)

Juhu, ich glaube ich habe es geschafft:


```
package zufallstring;
import java.security.SecureRandom;

public class Zufallstring {
    
    static String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    static SecureRandom random = new SecureRandom();
    static String randomString(int len) {
        StringBuilder sb = new StringBuilder(len);
        
        for(int i=0; i < len; i++)
        {           
            //sb.append(AB.charAt(random.nextInt(AB.length())));
            char c = AB.charAt(random.nextInt(AB.length()));
            sb.append(c);
            AB = AB.replace("" + c, "");
        }
        return sb.toString();
    }
    
    public static void main(String[] args) {
        System.out.println(AB);
        String zufall = randomString(AB.length());
        System.out.println(zufall);
    }
}
```

Kann bitte einer gucken, ob das so passt und ob irgendwelche Fehler drin sein können?


----------



## DrZoidberg (5. Apr 2015)

Das sieht schon mal sehr gut aus.
Aber ich würde dir empfehlen AB in der randomString Methode zu definieren, damit du die Methode mehrfach aufrufen kannst ohne AB kaputt zu machen. Ausserdem werden Variablennamen normalerweise klein geschrieben.

Also so

```
static String randomString(int len) {
    String ab = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    StringBuilder sb = new StringBuilder(len);

    for(int i=0; i < len; i++)
    {           
        char c = ab.charAt(random.nextInt(ab.length()));
        sb.append(c);
        ab = ab.replace("" + c, "");
    }
    return sb.toString();
}
```


----------



## matthias87 (6. Apr 2015)

Ok, habe das jetzt so gemacht, wie du das gesagt hast.
Aber wie sieht dann die main-Methode aus?
Habe das hier:

```
public static void main(String[] args) {
        System.out.println(ab);
        String zufall = randomString(ab.length());
        System.out.println(zufall);
    }
```

Er kann ab nicht mehr finden bzw. zugreifen.


----------



## matthias87 (6. Apr 2015)

Ok ich habe es gelöst. Vielen Dank an alle.


----------

