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

matthias87

Mitglied
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:
Java:
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.
 

matthias87

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

Saheeda

Top Contributor
@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

Mitglied
Habe jetzt folgendes gemacht:
Java:
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.
 

matthias87

Mitglied
Ok, habe das jetzt so wie du das gesagt hast gemacht:
Java:
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.
 
Zuletzt bearbeitet:

Saheeda

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

Aufruf.
So:
Java:
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:

Java:
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

Mitglied
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.
 
Zuletzt bearbeitet:

DrZoidberg

Top Contributor
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.
Java:
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
Java:
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;
  }
}
 

matthias87

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

Java:
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

Mitglied
Juhu, ich glaube ich habe es geschafft:

Java:
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

Top Contributor
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
Java:
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

Mitglied
Ok, habe das jetzt so gemacht, wie du das gesagt hast.
Aber wie sieht dann die main-Methode aus?
Habe das hier:
Java:
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.
 

Neue Themen


Oben