Stampare in modo casuale e non consecutivo elemento arraylist

di il
25 risposte

Stampare in modo casuale e non consecutivo elemento arraylist

Io e il mio amico abbiamo creato questo programma, in cui scegliamo quanti nomi inserire, gli inseriamo, vengono aggiunti nell'arraylist, dopo aver inserito l'ultimo nome viene generato un nome casuale e viene richiesto se far generare un altro nome e cosi via, se digitiamo n il programma finisce e stampa la lista dei nomi inseriti

Quello che non riusciamo a fare almeno per il momento, è che quando viene richiesto di far generare un altro nome, vorremmo che generasse sempre un nome diverso e mai lo stesso, cioè lo stesso nome non deve essere generato 2 volte in modo consecutivo

Es. se scelgo di inserire 3 nomi
1° ciao
2° come
3° va
stampa come,
scelgo di far generare un altro nome ciao
scelgo di far generare un altro nome va
scelgo di far generare un altro nome ciao
e cosi via

Questo è il codice
import java.util.*;

public class NomiArrayList {
	
	static Scanner sca = new Scanner(System.in);
	Random ran = new Random();
	ArrayList<String> nomi = new ArrayList<>();
	
	public String nome;
    int numero = 0;
    boolean controllo;
	
	//scegliere quanti nomi inserire
	public void sceltaNumeri() {
		
		int n = 0;
		
		System.out.println("********");
		System.out.println("* Nomi *");
		System.out.println("********");
		System.out.println("Digita Fine per terminare il programma");

		do {
			
			n = 0;

			System.out.println("Quanti nomi vuoi inserire?");
			String nume = sca.next();

			try{
				
				n = Integer.parseInt(nume);

			}
			
			catch(NumberFormatException e){

			}

			//controllo sullo 0 per l'ArrayList 
			if (n > 0) {
				
			}

			else if (n < 0){
				
				System.out.println("Inserisci un numero maggiore di 0");
				
			}

			else 

				System.out.println("Inserisci un numero");
			
			//variabile che assume valore di n al fuori del do-while
			numero = n;

		}

		while(n < 0 || n == 0);

	}
	
	//metodo per l'inserimento del nome
	public void inserisciNome() {
		
		sceltaNumeri();
		
        int inc = 1;
        
        for (int p=0; p<numero; p++) {

        	do {

        		inc--;

        		controllo = false;

        		if (inc < 0) {

        			inc = 0;
        			//t ='0';
        		}
        		
      		
     		}

        		System.out.println("Inserisci il " + (p + 1) + "°" + " Nome");
        		nome = sca.next();

        		nomi.add(nome);


        		for (int i=0; i<nome.length(); i++) {

        			if (!(nome.charAt(i) == '0') && !(inc == 0)) {
        				

        			}

        			else if ((nome.charAt(i) == '0' || nome.charAt(i) == '1' || nome.charAt(i) == '2' || nome.charAt(i) == '3' || 
        					  nome.charAt(i) == '4' || nome.charAt(i) == '5' || nome.charAt(i) == '6' || nome.charAt(i) == '7' || 
        					  nome.charAt(i) == '8' || nome.charAt(i) == '9') && inc == 0) {
        				
        				System.out.println("ERRORE! C'è un numero nel nome");

        				controllo = true;

        				inc++;
        				
        			}
        			
        		}

        		if (!nome.matches("[-0-9]+")) {

        		}

        		else

        			System.out.println("ERRORE! Inserisci un altro nome senza numeri");


        		try {

        			for (String numero : nomi) {

        				if (numero.matches("[-0-9]+")) {

        					nomi.remove(numero);
        				}

        				for (int m=0; m<nome.length(); m++) {

        					if (nome.charAt(m) == '0' || nome.charAt(m) == '1' || nome.charAt(m) == '2' || nome.charAt(m) == '3' || 
                				nome.charAt(m) == '4' || nome.charAt(m) == '5' || nome.charAt(m) == '6' || nome.charAt(m) == '7' || 
                				nome.charAt(m) == '8' || nome.charAt(m) == '9') {

        						nomi.remove(nome);
        					}
        				}
        				
        			}
        		}

        		catch (ConcurrentModificationException r) {

        		}

        	}

        	while(nome.matches("[-0-9]+") || controllo == true);

        	if (nome.equalsIgnoreCase("fine")) {

        		System.out.println("FINE");

        		break;

        	}

        }

		stampaNomeCasuale();
		
	}
	
	//metodo per la stampa dei nomi in modo casuale che inseriamo
	public void stampaNomeCasuale() {
		
		int rand=0;
		boolean check = true;
	
		String d;
		
		
		try {
			
			if (nome.equalsIgnoreCase("fine")) {
				
				rand = ran.nextInt(nomi.size() - 1);
				//check = true;
			}
			
			else {
				
				rand = ran.nextInt(nomi.size());
				check = false;
			}
			
			System.out.println();
			
			
			System.out.println("Il Nome casuale è " + nomi.get(rand));
			
			
			
			
			//System.out.println(rand);
		}
		
		catch(IllegalArgumentException e) {

			System.out.println("La lista dei Nomi è VUOTA!");

		}

			if (check == true) {

			}

			else

				richiedi();
		
	}
	
	//metodo per generare un altro nome
	public void richiedi() {
		
		String scelta;
	
		do {

			System.out.println();
			System.out.print("Vuoi far generare un altro nome? (Y/N): ");
			scelta = sca.next();
			
			if (scelta.equalsIgnoreCase("Y"))
				
			stampaNomeCasuale();
			
			else if (scelta.equalsIgnoreCase("N")) {
				
				System.out.println("FINE");
				System.out.println();
				
				System.out.println("Lista dei nomi");
				
				for (int i=0; i<nomi.size(); i++) {
					
					System.out.println("Il " + (i + 1) + "° " + nomi.get(i));
					
				}
				
				break;
			}
			
			else
				
				System.out.println("Comando errato!");
			
		}

		while (!scelta.equalsIgnoreCase("Y"));

	}


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		NomiArrayList no = new NomiArrayList();
		
		no.inserisciNome();
		
	}

}
Qualcuno può aiutarmi o darmi qualche consiglio?

25 Risposte

  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    Sembra complicato, ma e' semplice.
    e' semplice ma non banale.

    un generatore di numeri casuali genera, per sua natura, anche piu' volte lo stesso numero.

    il trucco e' questo:
    1) crei un vettore di N elementi
    2) lo riempi con i numeri da 0 a N-1 o da 1 a N
    3) lo MESCOLI (la 'genialata')

    a questo punto ti ritrovi con un vettore in cui c'e' un'unica istanza di ogni numero ma distribuiti nel vettore in modo casuale.

    ora puoi ricuperare il contenuto del vettore in modo ordinato sapendo che il risultato sara' un numero casuale tra 1 e N SENZA RIPETIZIONI
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    krisdark ha scritto:


    Quello che non riusciamo a fare almeno per il momento, è che quando viene richiesto di far generare un altro nome, vorremmo che generasse sempre un nome diverso e mai lo stesso, cioè lo stesso nome non deve essere generato 2 volte in modo consecutivo
    Ci sono (come minimo) due approcci. Uno l'ha detto migliorabile: mettere tutti i valori in una lista/array, "mescolare" subito tutto e quindi iterare la sequenza che è quindi già mescolata "casuale".
    L'altro è estrarre man mano solo un indice a caso per volta, estrarre il valore a quell'indice e poi ridurre "logicamente" la dimensione della sequenza.

    E nota bene, esistono i metodi shuffle?(List<?> list) e shuffle?(List<?> list, Random rnd) di java.util.Collections
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    Ho evidenziato quello che voglio che succeda e quello che non voglio

    P.s. sono la persona che ha aperto la discussione, ho cambiato account
    Allegati:
    30815_d49cb78a638beffb196a2af15ff21533.png
    30815_d49cb78a638beffb196a2af15ff21533.png
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    Abbiamo capito!
    Lo sappiamo!
    Ti abbiamo spiegato come fare!
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    migliorabile ha scritto:


    Abbiamo capito!
    Lo sappiamo!
    Ti abbiamo spiegato come fare!
    Scusa, pensavo che non mi ero spiegato bene
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    andbin ha scritto:


    krisdark ha scritto:


    Quello che non riusciamo a fare almeno per il momento, è che quando viene richiesto di far generare un altro nome, vorremmo che generasse sempre un nome diverso e mai lo stesso, cioè lo stesso nome non deve essere generato 2 volte in modo consecutivo
    Ci sono (come minimo) due approcci. Uno l'ha detto migliorabile: mettere tutti i valori in una lista/array, "mescolare" subito tutto e quindi iterare la sequenza che è quindi già mescolata "casuale".
    L'altro è estrarre man mano solo un indice a caso per volta, estrarre il valore a quell'indice e poi ridurre "logicamente" la dimensione della sequenza.

    E nota bene, esistono i metodi shuffle?(List<?> list) e shuffle?(List<?> list, Random rnd) di java.util.Collections
    Ciao, intendi una cosa del genere?
    Collections.shuffle(nomi, ran);
    	for (int i=0; i<nomi.size(); i++) {
    				
    	      //Collections.shuffle(nomi);
    		System.out.println(nomi.get(i));
    	    //System.out.println("Il Nome casuale è " + nomi.get(rand));
    				
    }
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    Mi spiegate meglio, non ho ben capito come fare
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    flashmaster ha scritto:


    Mi spiegate meglio, non ho ben capito come fare
    Lo abbiamo spiegato. Ma il "riassunto" è molto semplice: se non devi implementare tu la logica di mescolamento (es. per motivi "didattici" o che altro), esiste già il metodo shuffle ("mescola") in due varianti, con Random implicito e esplicito, della classe java.util.Collections.

    Quindi es.
    Collections.shuffle(tuaListaNomi);
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    andbin ha scritto:


    flashmaster ha scritto:


    Mi spiegate meglio, non ho ben capito come fare
    Lo abbiamo spiegato. Ma il "riassunto" è molto semplice: se non devi implementare tu la logica di mescolamento (es. per motivi "didattici" o che altro), esiste già il metodo shuffle ("mescola") in due varianti, con Random implicito e esplicito, della classe java.util.Collections.

    Quindi es.
    Collections.shuffle(tuaListaNomi);
    Questo l'ho capito, ma come faccio a stampare un singolo nome all'interno del mio arraylist?
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    flashmaster ha scritto:


    ma come faccio a stampare un singolo nome all'interno del mio arraylist?
    Mescoli la lista, poi:
    - stampi il primo
    - chiedi se stamparne un altro, No --> termini lì
    - stampi il secondo
    - chiedi se stamparne un altro, No --> termini lì
    ecc......
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    andbin ha scritto:


    flashmaster ha scritto:


    ma come faccio a stampare un singolo nome all'interno del mio arraylist?
    Mescoli la lista, poi:
    - stampi il primo
    - chiedi se stamparne un altro, No --> termini lì
    - stampi il secondo
    - chiedi se stamparne un altro, No --> termini lì
    ecc......
    Quindi dovrei fare cosi, nomi è come si chiama il mio arraylist
    Collections.shuffle(nomi); 
    System.out.println(nomi.get(0));
    e ogni volta che chiede se generare un altro nome e io dico SI, dovrebbe stampare un nome casuale, ma diverso da quello precedente?
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    flashmaster ha scritto:


    e ogni volta che chiede se generare un altro nome e io dico SI, dovrebbe stampare un nome casuale, ma diverso da quello precedente?
    Se nella lista erano stati inseriti "paperino", "gastone", "qui", "quo", "qua" e la mescoli con shuffle, l'ordine chiaramente diventa casuale.
    Quindi basta iterare sulla lista mescolata, stampare uno per uno fintanto che l'utente dice di continuare.
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    andbin ha scritto:


    flashmaster ha scritto:


    e ogni volta che chiede se generare un altro nome e io dico SI, dovrebbe stampare un nome casuale, ma diverso da quello precedente?
    Se nella lista erano stati inseriti "paperino", "gastone", "qui", "quo", "qua" e la mescoli con shuffle, l'ordine chiaramente diventa casuale.
    Quindi basta iterare sulla lista mescolata, stampare uno per uno fintanto che l'utente dice di continuare.
    Ok io ho fatto cosi
    Collections.shuffle(nomi);
    Iterator<String> it = nomi.iterator();
    System.out.println(it.next());
    Questo è il mio primo progetto che faccio con un mio amico, come avete notato non sono molto pratico
  • Re: Stampare in modo casuale e non consecutivo elemento arraylist

    flashmaster ha scritto:


    Collections.shuffle(nomi);
    Iterator<String> it = nomi.iterator();
    System.out.println(it.next());
    L'uso di Iterator va benissimo. Ed è pure "furbo" perché puoi sapere facilmente se c'è un prossimo elemento oppure no.
    Ma devi fare un ciclo: finché ci sono elementi, stampi. Dopo aver stampato una stringa, chiedi all'utente se continuare o no. Ma attenzione, fai la richiesta all'utente solo se non sei già all'ultimo elemento! (ed è qui che torna utile il Iterator !).
Devi accedere o registrarti per scrivere nel forum
25 risposte