Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Estrazione Premi Senza Ripetizioni

    Ciao a tutti ragazzi, sto scrivendo questo codice per un esame.

    Praticamente prendo da un database(File di testo) una lista di partecipanti a una lotteria.
    Devo estrarre tre nomi per 3 possibili premi.

    Il programma funziona tranne nella parte in cui si esclude che chi abbia già vinto un premio(primo estratto) posso vincerne un altro.
    Ed è qui che non riesco a capire come fare l'esclusione.

    Mi aiutereste please?

    codice:
    import java.util.*;import java.io.*;
    
    public class GestoreLotteria {
        public static ArrayList<Utente>utenti=new ArrayList<Utente>();
        public static String nome,cognome,città,data;
        public static int num=0;
        public static int totaleUtenti;
        public static int primo,secondo,terzo;
        public static Random estrai=new Random();
        
        
        public static void main(String[] args) throws FileNotFoundException {        
            
            Scanner scan=new Scanner(new File("databaseLotteria2.txt"));
            while(scan.hasNext())
            {
            nome=scan.next();
            cognome=scan.next();
            città=scan.next();
            num=num+1;
                
            utenti.add(new Utente(nome,cognome,città,data,num));
            }
            totaleUtenti=num;
            
            System.out.println("Utenti presenti nel database:" );
            
            //ESTRAZIONE 
            for(int i=0;i<utenti.size();i++)
            {
                System.out.println(utenti.get(i).toString());
                primo=estrai.nextInt(totaleUtenti);
                secondo=estrai.nextInt(totaleUtenti-primo);
                terzo=estrai.nextInt(totaleUtenti-primo-secondo);
            }
        
        
        System.out.println(" ");
        System.out.println(" il primo premio va a " +utenti.get(primo).toString());
        System.out.println(" il secondo premio va a " +utenti.get(secondo).toString());
        System.out.println(" il terzo premio va a " +utenti.get(terzo).toString());
        
        }
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da cicciozza Visualizza il messaggio
    Ed è qui che non riesco a capire come fare l'esclusione.
    Dato un ArrayList contenente N elementi, a patto che nella collezione non ci siano "duplicati" (ovvio), per estrarre elementi "unici" (che siano estraibili una volta sola), la soluzione è banale:

    a) si genera un indice "casuale" compreso tra 0 e size()-1 (o se vogliamo vederlo nel senso del nextInt di Random, fino a size() escluso)
    b) si invoca il remove(int index) di ArrayList. Questo rimuove l'elemento dalla collezione E lo restituisce.

    Si ripete da a) finché serve o finché ci sono elementi. Tutto qui. Chiaramente la collezione viene modificata togliendo materialmente gli elementi. Inoltre il remove(indice) è poco efficiente poiché ha complessità O(n) in quanto deve spostare indietro di una posizione tutti gli elementi successivi. Se hai 10, 100, 1000 elementi questo NON è un problema rilevante o a cui dovresti pensare visto che è solo una esercitazione.

    Se non vuoi modificare la collezione o se vuoi estrarre in modo più efficiente, ci sono altre soluzioni.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Ho modificato l'estrazione e adesso funziona alla grande!
    Ma immagino si possa migliorare
    Grazie Andbin!

    codice:
            System.out.println("**********ESTRAZIONE********** ");
    
    
    //primo
            primo=estrai.nextInt(totaleUtenti);
            System.out.println(" il primo premio va a " +utenti.get(primo).toString());
            utenti.remove(utenti.get(primo));
    
    
            System.out.println("UTENTI RIMASTI");
            for(int i=0;i<utenti.size();i++)
            {
                System.out.println(utenti.get(i).toString());
            }    
            System.out.println(" ");    
    //secondo    
            secondo=estrai.nextInt(totaleUtenti-1);
            System.out.println(" il secondo premio va a " +utenti.get(secondo).toString());
            utenti.remove(utenti.get(secondo));
    
    
            System.out.println("UTENTI RIMASTI");
            for(int i=0;i<utenti.size();i++)
            {
                System.out.println(utenti.get(i).toString());
            }
            System.out.println(" ");
    //terzo
            terzo=estrai.nextInt(totaleUtenti-2);
            System.out.println(" il terzo premio va a " +utenti.get(terzo).toString());
            utenti.remove(utenti.get(terzo));
    
    
            System.out.println("UTENTI che non vincono NULLA");
            for(int i=0;i<utenti.size();i++)
            {
                System.out.println(utenti.get(i).toString());
            }
        }
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da cicciozza Visualizza il messaggio
    Ma immagino si possa migliorare


    codice:
    ArrayList<Utente> utenti = ........
    Random rnd = new Random();
    
    .....
    .....
    
    Utente primoUtenteEstratto = utenti.remove(rnd.nextInt(utenti.size()));
    Utente secondoUtenteEstratto = utenti.remove(rnd.nextInt(utenti.size()));
    Utente terzoUtenteEstratto = utenti.remove(rnd.nextInt(utenti.size()));

    È proprio tutto qui. Non mi pare difficile, vero?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.