Domanda Risolto Creare oggetti in maniera casuale java

jr_sottomajor

Utente Silver
2 Luglio 2017
96
33
4
79
mostro.png

Salve a tutti avrei bisogno di un aiuto per questi punti di un problema. In parole povere ho una classe Mostro, il suo costruttore prende come parametri una stringa che riguarda il nome, un double che riguarda il livello di energia del mostro e un double che riguarda la vitalità.
Java:
public Mostro(String nome,double livelloEnergia,double vitalita) {
        this.nome=nome;
        this.livelloEnergia=livelloEnergia;
        this.vitalita=vitalita;
    }

Poi c'è una classe Combattimento il cui costruttore prende come parametri un arrayList di oggetti Mostro.
Java:
public Combattimento(ArrayList<Mostro> mostri) {
        listaMostri=mostri;
    }
Fin qui tutto molto semplice. Ora, come faccio ad istanziare 20 mostri "Scelti in maniera casuale"? Devo comunque passare vari parametri a ogni nuovo mostro creato, devo crearne manualmente 20 o c'è un altro modo? Grazie
 
Con un normalissimo for:
Java:
private static Random rng = new Random();
                                                    
public static double rand(double min, double max) {
    return min + rng.nextDouble() * max;
}

// ....

List<Mostro> mostri = new ArrayList();
for (int i = 1; i <= 20; i++) 
    mostri.add(new Mostro("Mostro " + i, rand(40, 50), rand(10, 40)));
 
  • Mi piace
Reazioni: jr_sottomajor
Perfetto, chiarissimo. Se invece mi trovassi a dover usare una stringa particolare, ad esempio:
formato stringa.png

Avendo la targa di un veicolo un formato predefinito, si deve fare un controllo sull'input per vedere se rispetta il formato? Come potrei fare in tal caso?
 
Ultima modifica:
Intanto se la domanda cambia è sempre meglio aprire una nuova discussione; magari la prossima volta aprine una nuova
Comunque, l'opzione più "avanzata" è quella di utilizzare delle espressioni regolari con la classe java.util.regex.Pattern. Trovi subito in cima alla pagina nel link un esempio su come utilizzarle. Qui ti scrivo solo le regex per i due formati:
Autoveicolo: ^[A-Z]{2}[0-9]{3}[A-Z]{2}$
Motociclo: ^[A-Z]{2}[0-9]{5}$
Accettano solo lettere maiuscole. Se vuoi che accettino anche lettere minuscole ti basta sostituire ogni [A-Z] con [A-Za-z].
Per creare e testare regex è comodo Regex101.

In alternativa, puoi anche scorrere la stringa della targa carattere per carattere utilizzando java.lang.String::charAt(int). Ti basta una variabile indice intera, un ciclo for e uno o due if. Puoi usare i metodi della classe java.lang.Character per controllare se un carattere è una lettera, un numero o altro.
 
  • Mi piace
Reazioni: jr_sottomajor
Perfetto, in realtà le espressioni regolari non mi sono ancora state spiegate nel loro utilizzo, solo qualche cenno teorico. Potresti farmi vedere come faresti col ciclo for e gli if?
 
Perfetto, in realtà le espressioni regolari non mi sono ancora state spiegate nel loro utilizzo, solo qualche cenno teorico. Potresti farmi vedere come faresti col ciclo for e gli if?
Java:
String str = "AA123BB";
if (str.length() != 7)
    return false; //invalid
for (int i = 0; i < 7; i++)
    if (((i < 2 || i > 4) && (str.charAt(i) < 'A' || str.charAt(i) > 'Z'))
        || ((i > 1 && i < 5) && (str.charAt(i) < '0' || str.charAt(i) > '9')))
        return false; //invalid
return true; //valid
Per il caso motocicli basta cambiare un po' i limiti dell'indice i nella condizione if.
 
Java:
String str = "AA123BB";
if (str.length() != 7)
    return false; //invalid
for (int i = 0; i < 7; i++)
    if (((i < 2 || i > 4) && (str.charAt(i) < 'A' || str.charAt(i) > 'Z'))
        || ((i > 1 && i < 5) && (str.charAt(i) < '0' || str.charAt(i) > '9')))
        return false; //invalid
return true; //valid
Per il caso motocicli basta cambiare un po' i limiti dell'indice i nella condizione if.
In questo modo si tiene conto anche delle lettere minuscole? Bisogna fare riferimento alle tabelle ascii per questo genere di condizioni? Grazie
 
No, in questo modo tiene conto solo delle maiuscole. Per le lettere minuscole devi aggiungere anche le comparazioni con le lettere minuscole.
Le comparazioni vengono fatte con la codifica ASCII (in realtà UTF-16, ma in questo caso è uguale). Ma non hai bisogno di guardare le tabelle per questo esercizio, è sufficiente controllare che ogni carattere nelle prime due e ultime due posizioni sia compreso tra i caratteri 'A' e 'Z' mentre gli altri siano compresi tra '0' e '9'. Se vuoi supportare anche le lettere minuscole basta, tramite || (OR) aggiungere la condizione che le lettere possano essere anche comprese tra 'a' e 'z'.
 
  • Mi piace
Reazioni: jr_sottomajor
No, in questo modo tiene conto solo delle maiuscole. Per le lettere minuscole devi aggiungere anche le comparazioni con le lettere minuscole.
Le comparazioni vengono fatte con la codifica ASCII (in realtà UTF-16, ma in questo caso è uguale). Ma non hai bisogno di guardare le tabelle per questo esercizio, è sufficiente controllare che ogni carattere nelle prime due e ultime due posizioni sia compreso tra i caratteri 'A' e 'Z' mentre gli altri siano compresi tra '0' e '9'. Se vuoi supportare anche le lettere minuscole basta, tramite || (OR) aggiungere la condizione che le lettere possano essere anche comprese tra 'a' e 'z'.
Grazie mille, gentilissimo