2016-01-02 14 views
5

Próbuję utworzyć program do generowania losowej nazwy konta dla użytkownika. Użytkownik kliknie przycisk, który skopiuje nazwę konta do schowka. Część GUI działa, ale po prostu nie mogę wymyślić najlepszego sposobu radzenia sobie z przypadkową generacją ciągu.Algorytm generowania losowego łańcucha z surowymi ograniczeniami - Java

dozwolone znaki w nazwie użytkownika: A-Z a-z _

żadne numery, mogą wystąpić żadne inne symbole, a nie dwa tego samego znaku w wierszu.

Musi mieć długość sześć.

Mój pomysł:

create an array of characters: 

[ _, a, b, c, d ... etc ] 

Generate a random integer between 0 and array.length - 1 
and pick the letter in that slot. 

Check the last character to be added into the output String, 
and if it's the same as the one we just picked, pick again. 

Otherwise, add it to the end of our String. 

Stop if the String length is of length six. 

Czy istnieje lepszy sposób? Być może z regex? Mam przeczucie, że myślę o zrobieniu tego tutaj, jest naprawdę złe.

+1

Wystarczy być jasne, 'a_a_a_' jest w porządku? – user1803551

+0

Dlaczego potrzebujesz lepszego sposobu? Co jest nie tak z twoim pomysłem? Jest prosty, odpowiada Twoim wymaganiom - wystarczy go zakodować. – user3707125

+2

Pamiętaj, że prawdopodobnie zapomniałeś o ważnym ograniczeniu: nie możesz mieć dwóch użytkowników o tej samej nazwie, prawda? Dlaczego nie pozwolisz użytkownikom wybrać własnego nazwiska, które mogą zmienić? Przygotuj się na ciągłe prośby użytkowników, którzy zapomnieli o nazwie swojego konta. –

Odpowiedz

3

Nie widzę niczego złego w proponowanym algorytmie (oprócz tego, że musisz obsłużyć pierwszy dodany znak bez sprawdzania, czy już go dodałeś). Można także wyodrębnić go do sposobu static i używać Random podobnego

static Random rand = new Random(); 

static String getPassword(String alphabet, int len) { 
    StringBuilder sb = new StringBuilder(len); 
    while (sb.length() < len) { 
    char ch = alphabet.charAt(rand.nextInt(alphabet.length())); 
    if (sb.length() > 0) { 
     if (sb.charAt(sb.length() - 1) != ch) { 
     sb.append(ch); 
     } 
    } else { 
     sb.append(ch); 
    } 
    } 
    return sb.toString(); 
} 

Następnie można nazwać coś podobnego,

public static void main(String[] args) { 
    StringBuilder alphabet = new StringBuilder(); 
    for (char ch = 'a'; ch <= 'z'; ch++) { 
    alphabet.append(ch); 
    } 
    alphabet.append(alphabet.toString().toUpperCase()).append('_'); 
    String pass = getPassword(alphabet.toString(), 6); 
    System.out.println(pass); 
} 
+0

Dobry pomysł z Stringbuilder. Zapomniałem, że to istnieje. Dzięki! – Hatefiend

Powiązane problemy