DOMANDA [JAVA] Nuovi oggetti da tastiera, come si fa?

Paakiv

Utente Attivo
570
12
Buonasera.
Vorrei scrivere un ciclo su Java che possa chiedermi fino alla pressione di un determinato tasto dei valori che saranno gli attributi di un oggetto, che verrà creato ogni volta e aggiunto ad un lista (array, arraylist, mi è pressochè indifferente per ora, almeno spero).
Come si fa? Il problema principale è ottenere l'input da tastiera!
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ciao, se hai già una soluzione anche parziale o non funzionante postala, da quella riceverai aiuti/consigli (da regolamento, non si danno soluzioni già "pronte").

Per l'input da tastiera ci sono tante strade... ricordo BufferedInputStream e Scanner. Anche nel package java.nio c'erano classi utili a tale scopo (parlo al passato in quanto non scrivo in Java da un pò di tempo).
Con Scanner (java.util.Scanner) è molto semplice:

Java:
Scanner keyboard = new Scanner(System.in);

Attenzione poichè usa un delimitatore che è lo spazio; dovrai passargliene uno tuo (come l'Invio) per evitare di trovare solo una parola nel buffer.
La doc di Java è sempre stata una delle migliori e più comode che abbia consultato: https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
 
  • Mi piace
Reazioni: Paakiv e rodhellas

Paakiv

Utente Attivo
570
12
Ciao, se hai già una soluzione anche parziale o non funzionante postala, da quella riceverai aiuti/consigli (da regolamento, non si danno soluzioni già "pronte").
Quello che ho scritto non funziona quindi a questo punto è meglio riscriverlo da capo
Per l'input da tastiera ci sono tante strade... ricordo BufferedInputStream e Scanner. Anche nel package java.nio c'erano classi utili a tale scopo (parlo al passato in quanto non scrivo in Java da un pò di tempo).
Con Scanner (java.util.Scanner) è molto semplice:
Java:
Scanner keyboard = new Scanner(System.in);
Io non capisco in keyboard cosa ci finisca. E' un oggetto scanner ma quind può contenere qualsiasi tipo di dato? E perchè si usa il next?
Attenzione poichè usa un delimitatore che è lo spazio; dovrai passargliene uno tuo (come l'Invio) per evitare di trovare solo una parola nel buffer.
La doc di Java è sempre stata una delle migliori e più comode che abbia consultato: https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html
La doc di Java è la prima cosa che ho guardato e non ho capito. Non c'è qualcosa che fa proprio quello che dico io, eppure penso sia una cosa abbastanza banale. Non ho capito che succede con lo spazio.
 
Ultima modifica:

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Io non capisco in keyboard cosa ci finisca.
In keyboard ( con System.in come Source ) ci finiscono tutti i tasti premuti dalla tastiera :ok:.
E' un oggetto scanner ma quind può contenere qualsiasi tipo di dato?
A simple text scanner which can parse primitive types and strings using regular expressions. Prima riga della java doc
E perchè si usa il next?
Si usa il next() per ottenere il prossimo token ( una sequenza di caratteri ). I token vengono ricavati usando gli spazi come separatori. Per leggere tutta una riga devi usare nextLine()
 

Paakiv

Utente Attivo
570
12
Java:
while(selection == 1){
            Scanner scan = new Scanner(System.in);

            System.out.println("Inserisci nome: ");
            String nome = scan.next();

            Persona p = new Persona(nome);

            partecipanti.add(p);
          
            System.out.println(partecipanti);
}
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Java:
while(selection == 1){
Scanner scan = new Scanner(System.in);

System.out.println("Inserisci nome: ");
String nome = scan.next();

Persona p = new Persona(nome);

partecipanti.add(p);

System.out.println(partecipanti);
}
Non è propriamente corretto. Lo scanner va creato una volta sola, va fuori dal ciclo.
Partecipanti è un ArrayList? Non puoi stamparlo così, andando a memoria, non mi sembra ridefinisca toString(), ma potrei anche ricordare male.

Fai attenzione: come detto sopra se ti servono ad esempio nome e cognome, quindi un input come "Mario Rossi", ti verrebbe restituito solo "Mario", poiché il token è lo spazio. Devi settare l'invio, quindi:

Java:
scanner.useDelimiter("\r\n");

Inviato da ONEPLUS A5000 tramite App ufficiale di Tom\'s Hardware Italia Forum
 

Paakiv

Utente Attivo
570
12
Si, partecipanti è un arraylist. Non sapevo neanche si potesse inserire il delimitatore personalizzato. Comunque poco importa perchè devo inserire solo i nomi.

Java:
public class Main {
    public static void main(String[] args){
    int selection = 1;
    ArrayList partecipanti = new ArrayList();
    Scanner scan = new Scanner(System.in);
    scan.useDelimiter("\r\n"); //MI DA WARNING
        while(selection == 1){
            System.out.println("Inserisci nome: ");
            String nome = scan.next();
            Persona p = new Persona(nome);
            partecipanti.add(p);
            selection = scan.nextInt();
        }
        partecipanti.toString();
    }
}
 
Ultima modifica:

Paakiv

Utente Attivo
570
12
In keyboard ( con System.in come Source ) ci finiscono tutti i tasti premuti dalla tastiera :ok:.)
Quindi l'oggetto scanner è unico anche per più di un input da tastiera, perchè non ci finisce nulla dentro, giusto?

A simple text scanner which can parse primitive types and strings using regular expressions. Prima riga della java doc)
Sono un po' una pippa con l'inglese.

Si usa il next() per ottenere il prossimo token ( una sequenza di caratteri ). I token vengono ricavati usando gli spazi come separatori. Per leggere tutta una riga devi usare nextLine()
Dovrei quindi inserire questa linea per ogni parola che inserisco, come faccio a prevederlo?
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Quindi l'oggetto scanner è unico anche per più di un input da tastiera, perchè non ci finisce nulla dentro, giusto?
Ci finisce dentro l'input da tastiera se lo fai da System.in. La questione dell'essere unico si riferiva al fatto che tu instanziavi un nuovo oggetto scanner ad ogni ciclo, finchè non lo chiudi lui continuerà a leggere da tastiera.
Sono un po' una pippa con l'inglese.
Lo scanner può capire tutti i tipi primitivi e le stringhe (usando le espressioni regolari).
Dovrei quindi inserire questa linea per ogni parola che inserisco, come faccio a prevederlo?
nextLine() legge tutto finchè non arriva un invio (\n). Puoi scrivere anche una sola lettera, se poi premi invio lui la leggerà come elemento
 
  • Mi piace
Reazioni: Paakiv

Paakiv

Utente Attivo
570
12
Ci finisce dentro l'input da tastiera se lo fai da System.in. La questione dell'essere unico si riferiva al fatto che tu instanziavi un nuovo oggetto scanner ad ogni ciclo, finchè non lo chiudi lui continuerà a leggere da tastiera.
Ah ok, quindi smette di leggere quando finisce il ciclo.
Lo scanner può capire tutti i tipi primitivi e le stringhe (usando le espressioni regolari).
Si alla fine ci sono arrivato!
nextLine() legge tutto finchè non arriva un invio (\n). Puoi scrivere anche una sola lettera, se poi premi invio lui la leggerà come elemento
Ok, capito grazie, anche se scanner.useDelimiter("\r\n"); mi da warning!
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Che tipo di warning?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ah ok, quindi smette di leggere quando finisce il ciclo.
Si alla fine ci sono arrivato!
Ok, capito grazie, anche se scanner.useDelimiter("\r\n"); mi da warning!
Prova al termine della lettura fare:

Java:
scanner.close();

Una cosa che notai ieri: stai usando ArrayList senza sintassi generica, e non è corretto (da Java 5 in avanti). Da Java 5 il collection frameworks è generico; il vecchio modo funziona sempre, ma non sarebbe da utilizzare.


Inviato da ONEPLUS A5000 tramite App ufficiale di Tom\'s Hardware Italia Forum
 

Paakiv

Utente Attivo
570
12
Prova al termine della lettura fare:
Java:
scanner.close();
Ho trovato un altro modo, finisco di provarlo e posto il codice
Una cosa che notai ieri: stai usando ArrayList senza sintassi generica, e non è corretto (da Java 5 in avanti). Da Java 5 il collection frameworks è generico; il vecchio modo funziona sempre, ma non sarebbe da utilizzare.
Cosa intendi per sintassi generica? Io sto utilizzando tutte le conoscenze datemi al corso di Java.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ho trovato un altro modo, finisco di provarlo e posto il codice
Cosa intendi per sintassi generica? Io sto utilizzando tutte le conoscenze datemi al corso di Java.
Da smartphone rimuove "maggiore" e "minore"...

Comunque si tratta di:
Java:
ArrayList<Persona> partecipanti = new ArrayList<Persona>();
 

Paakiv

Utente Attivo
570
12
Da smartphone rimuove "maggiore" e "minore"...
Ah ok, al mio corso sono stati chiamati diamantini, per questo non capivo. Comunque lo avevo fatto.
Ho modificato il programma, l'ho fatto in modo leggermente diverso ma ho comunque problemi in alcuni punti, che ho commentato e non sono riuscito a risolvere nemmeno googlando.
Metto tutto sotto spoiler perchè è molto lungo.
Java:
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;

public class Menu {
    Scanner scan = new Scanner(System.in);
    ArrayList<Persona> partecipanti = new ArrayList();
    ArrayList<Ruolo> personaggi = new ArrayList();
    ArrayList<Argomento> temi = new ArrayList();

    public static void main(String[] args) {
       
        menu_principale();

    }

    public void menu_principale() {
        int liv0_sel1;

        do{
            System.out.println("Menu Principale");
            System.out.println("+-----------------------------------------------+");
            System.out.println("[1] PARTECIPANTI     Apre il Menu dei Partecipanti");
            System.out.println("[2] PERSONAGGI         Apre il Menu dei Personaggi");
            System.out.println("[3] TEMI             Apre il Menu dei Temi");
            System.out.println("[0] ESCI             Chiude il Pprogramma");
            System.out.println("+-----------------------------------------------+");
            System.out.print("--> ");
            liv0_sel1 = scan.nextInt();

            while(liv0_sel1 < 0 || liv0_sel1 > 3){
//                 Pulisci Schermo
                System.out.println("Scelta sbagliata, riprova.");
//                 Pausa
//                 Pulisci Schermo
                System.out.println("Menu Principale");
                System.out.println("+-----------------------------------------------+");
                System.out.println("[1] PARTECIPANTI     Apre il Menu dei Partecipanti");
                System.out.println("[2] PERSONAGGI         Apre il Menu dei Personaggi");
                System.out.println("[3] TEMI             Apre il Menu dei Temi");
                System.out.println("[0] ESCI             Chiude il programma");
                System.out.println("+-----------------------------------------------+");
                System.out.print("--> ");
                liv0_sel1 = scan.nextInt();
            }

            switch(liv0_sel1){
                case 1:
                    menu_partecipanti();
                case 2:
                    menu_personaggi();
                case 3:
                    menu_temi();
            }
        }while(liv0_sel1 != 0)
        System.out.println("Alla prossima!");
    }

    public void menu_partecipanti() {
        int liv1_sel1;

//         Pulisci Schermo
        System.out.println("Menu Partecipante");
        System.out.println("+------------------------------------------+");
        System.out.println("[1] - AGGIUNGI        Aggiunge un partecipante");
        System.out.println("[2] - ELIMINA        Elimina un partecipante");
        System.out.println("[3] - MISCHIA        Mischia i partecipante");
        System.out.println("[4] - STAMPA        Stampa i partecipante");
        System.out.println("[0] - INDIETRO        Torna al Menu Precedente");
        System.out.println("+------------------------------------------+");
        System.out.print("--> ");
        liv1_sel1 = scan.nextInt();

        while(liv1_sel1 < 0 || liv1_sel1 > 4){
//            Pausa
            System.out.println("Scelta sbagliata, riprova.");
//            Pausa
//             Pulisci Schermo
            System.out.println("Menu Partecipante");
            System.out.println("+------------------------------------------+");
            System.out.println("[1] - AGGIUNGI        Aggiunge un partecipante");
            System.out.println("[2] - ELIMINA        Elimina un partecipante");
            System.out.println("[3] - MISCHIA        Mischia i partecipante");
            System.out.println("[4] - STAMPA        Stampa i partecipante");
            System.out.println("[0] - INDIETRO        Torna al Menu Precedente");
            System.out.println("+------------------------------------------+");
            System.out.print("--> ");
            liv1_sel1 = scan.nextInt();
        }
   
        switch(liv1_sel1){
            case 1:
                String nome;
                System.out.print("Inserisci nome: ");
                nome = scan.nextLine();
                partecipanti.add(new Persona(nome));
                System.out.print("I partecipanti inseriti fino ad ora sono: ");
                for(int i = 0; i < partecipanti.size; i++){
                    partecipanti.get(i).toString();
                }
            case 2:
                String nome;
                System.out.print("Inserisci nome: ");
                nome = keys.nextLine();
                partecipanti.remove(nome);
                System.out.print("Hai eliminato: " + nome);
                System.out.print("I partecipanti rimanenti sono: ");
                for(int i = 0; i < partecipanti.size; i++){
                    partecipanti.get(i).toString();
                }
            case 3:
                Collections.shuffle(partecipanti);
                Collections.shuffle(partecipanti);
                Collections.shuffle(partecipanti);
                System.out.print("I partecipanti sono stai mescolati");
            case 4:
                menu_partecipanti_divisioni();
//            case 0:
//                Torna al menù precedente
        }
    }

    public void menu_partecipanti_divisioni() {
        int liv2_sel2_opt4;

//         Pulisci Schermo
        System.out.println("Menu Personaggi");
        System.out.println("+---------------------------------------------------------------+");
        System.out.println("[1] - SINGOLI       ");
        System.out.println("[2] - COPPIE        ");
        System.out.println("[3] - TRIPLETTE     ");
        System.out.println("[0] - INDIETRO      ");
        System.out.println("+---------------------------------------------------------------+");
        System.out.print("--> ");
        liv2_sel2_opt4 = scan.nextInt();

        while(liv2_sel2_opt4 < 0 || liv2_sel2_opt4 > 3){
//            Pausa
            System.out.println("Scelta sbagliata, riprova.");
//             Pausa
//             Pulisci Schermo
            System.out.println("Menu Personaggi");
            System.out.println("+---------------------------------------------------------------+");
            System.out.println("[1] - SINGOLI       ");
            System.out.println("[2] - COPPIE        ");
            System.out.println("[3] - TRIPLETTE     ");
            System.out.println("[0] - INDIETRO      ");
            System.out.println("+---------------------------------------------------------------+");
            System.out.print("--> ");
            liv2_sel2_opt4 = scan.nextInt();
        }

        switch(liv2_sel2_opt4){
            case 1:
                for(Persona p : partecipanti){
                    p.toString();
                    System.out.println("\n");
                }
            case 2:
                if(partecipanti.size() % 2 != 0){
                    partecipanti.add(new Persona("Ripescaggio"));
                }
                for(int i = 0; i < partecipanti.size(); i += 2){
                    partecipanti.get(i).toString;
                    partecipanti.get(i+1).toString;
                    System.out.println("\n");
                }
            case 3:
                if(partecipanti.size() % 3 != 0){
                    if(partecipanti.size() % 3 == 1){
                        partecipanti.add(new Persona("Ripescaggio"));
                    }
                    if(partecipanti.size() % 3 == 2){
                        partecipanti.add(new Persona("Ripescaggio"));
                        partecipanti.add(new Persona("Ripescaggio"));
                    }
                }
                for(int i = 0; i < partecipanti.size(); i += 3){
                    partecipanti.get(i).toString;
                    partecipanti.get(i+1).toString;
                    partecipanti.get(i+2).toString;
                    System.out.println("\n");
                }
//            case 0:
//                Torna al menù precedente
        }
    }

    public void menu_personaggi() {
        int liv1_sel1;

//         Pulisci Schermo
        System.out.println("Menu Personaggi");
        System.out.println("+---------------------------------------------------------------+");
        System.out.println("[1] - ASSEGNA        Assegna un personaggio ad un partecipante");
        System.out.println("[2] - STAMPA        Stampa i personaggi associati ai partecipanti");
        System.out.println("[0] - INDIETRO        Torna al Menu Precedente");
        System.out.println("+---------------------------------------------------------------+");
        System.out.print("--> ");
        liv1_sel1 = scan.nextInt();

        while(liv1_sel1 < 0 || liv1_sel1 > 2){
//            Pausa
            System.out.println("Scelta sbagliata, riprova.");
//             Pausa
//             Pulisci Schermo
            System.out.println("Menu Personaggi");
            System.out.println("+---------------------------------------------------------------+");
            System.out.println("[1] - ASSEGNA        Assegna un personaggio ad un partecipante");
            System.out.println("[2] - STAMPA        Stampa i personaggi associati ai partecipanti");
            System.out.println("[0] - INDIETRO        Torna al Menu Precedente");
            System.out.println("+---------------------------------------------------------------+");
            System.out.print("--> ");
            liv1_sel1 = scan.nextInt();
        }

        switch(liv1_sel1){
            case 1:
               
            case 2:

//            case 0:
//                Torna al menù precedente
        }
    }

    public void menu_temi() {
        int liv1_sel3;

//         Pulisci Schermo
        System.out.println("Menu Temi");
        System.out.println("+------------------------------------------+");
        System.out.println("[1] - STAMPA        Stampa un tema");
        System.out.println("[0] - INDIETRO        Torna al Menu Precedente");
        System.out.println("+------------------------------------------+");
        System.out.print("--> ");
        liv1_sel3 = scan.nextInt();

        while(liv1_sel3 < 0 || liv1_sel3 > 1){
//             Pausa
            System.out.println("Scelta sbagliata, riprova.");
//             Pausa
//             Pulisci Schermo
            System.out.println("Menu Temi");
            System.out.println("+------------------------------------------+");
            System.out.println("[1] - STAMPA        Stampa un tema");
            System.out.println("[0] - INDIETRO        Torna al Menu Precedente");
            System.out.println("+------------------------------------------+");
            System.out.print("--> ");
            liv1_sel3 = scan.nextInt();
        }

        switch(liv1_sel3){
            case 1:

//            case 0:
//                Torna al menù precedente
        }      
    }
}

==================================================================================================

public class Persona {
    private String nome;

    public Persona (String nome) {
        this.nome = nome;
    }

    //

    @Override
    public String toString() {
        return "[" + name + "]";
    }
}
Ovviamente da come si evince devo completarlo anche il altre cose che farò appena ho un po' di tempo.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili