Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    Metodo che non fa quello che dovrebbe.

    Sono sempre stata una sega con i cicli for... infatti questo (pezzo di) metodo non lavora come mi aspetterei:

    codice:
            for (Offerta key : offerte.values()) {
                if (key.getIdAsta() == idAsta) { //controllo se esistono gia' offerte per quell'asta
                    if (key.getOfferta() != null && key.getOfferta() >= importo) {
                        return 0; //l'offerta non e' superiore all'ultima inserita o al prezzo base
                    } else {
                        //se tutto corretto inserisco la nuova offerta
                        ultimoId++;
                        Offerta nuovaOfferta = new Offerta (ultimoId, offerente, importo, idAsta);
                        offerte.put(ultimoId, nuovaOfferta);
                        break;
                    }
                }
            }
            db.commit();
            db.close();
            return 1;
    Il return 0 avviene solo quando l'offerta (importo) inserita e' inferiore al prezzo base (sarebbe il valore che in teoria è estratto da key.getOfferta()) ma se l'offerta e' inferiore ad un'offerta gia' inserita mi fa un return 1 che sarebbe in teoria il codice del tutto corretto, cioè offerta inserita correttamente. Ma mi sembra evidente che in realta' le offerte non le sta inserendo altrimenti non mi spiego come possa superare questo controllo (key.getOfferta() != null && key.getOfferta() >= importo).
    Spero di essermi spiegata.
    Dove sbaglio? Grazie.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non ho capito esattamente cosa vuoi ottenere, ma quel ciclo for termina non appena trova un'offerta in cui getIdAsta() è uguale a idAsta. Perchè in quel caso entra nella prima if e, qualunque sia il ramo preso dalla seconda if il ciclo for termina immediatamente (se entra nel ramo "then" della seconda if termina perchè viene eseguita una return, altrimenti termina perchè viene eseguita una break.

    E' questo il comportamento che vuoi? Cioè, alla prima offerta nella lista che corrisponde al idAsta il ciclo termina e non vengono più controllate le eventuali altre offerte.

    Oppure non ho capito quale sia la problematica...


    Ciao.
    Ultima modifica di LeleFT; 30-01-2018 a 13:55
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Questo metodo si occupa dell'inserimento di una nuova offerta.
    Il primo if, ovvero quello che controlla se l'id dell'asta (idAsta) passato dal metodo corrisponde all'id di un'asta presente in offerte, dovrebbe dirmi se per l'asta che ho selezionato esiste già un'offerta inserita. Questo dovrebbe risultare sempre vero visto che ad ogni inserimento di un'asta viene inserita anche una nuova offerta pari al prezzo base. Quindi diciamo che questo controllo e' quasi superfluo, ma mi serve (in teoria) per assicurarmi che sto imputanto l'offerta all'asta giusta. Dunque passa sempre al secondo if, che dovrebbe controllare che l'offerta inserita sia superiore all'ultima presente per quell'asta. Se non lo è, andiamo al return 0 che impedisce l'inserimento dell'offerta. Se invece quel controllo dà esito negativo, ovvero se l'offerta che si vuole inserire (importo) è superiore all'ultima inserita, allora dovrebbe passare al ramo else e quindi inserire l'offerta e poi uscire dal ciclo.
    Questo è il comportamento che vorrei. Ma mi pare che non vada così...dove sbaglio? La mia sensazione è che nel ramo else non ci vada mai, ma non capisco perché.
    Credo di aver capito cosa intendi: non è il comportamento che vorrei, io vorrei che il ciclo continui a controllare tutte le offerte, non deve fermarsi alla prima che trova... ma a quella piu' alta presente...sicuramente ho sbagliato qualcosa!
    Ultima modifica di Jamie04; 30-01-2018 a 14:45

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Potrei aver risolto...mi sembra che ora vada bene... che ne pensate?

    codice:
            for (Offerta key : offerte.values()) {
    
                if (key.getIdAsta() == idAsta) { //controllo se esistono gia' offerte per quell'asta
                    //se ne trova almeno una, cerco che non ce ne siano altre
                    for (Offerta key1 : offerte.values()) {
    
                        if (key1.getOfferta() != null && key.getOfferta() >= importo)
                            return 0; //l'offerta non e' superiore all'ultima inserita o al prezzo base
    
                        else {
    
                            //se tutto corretto inserisco la nuova offerta
                            ultimoId++;
                            Offerta nuovaOfferta = new Offerta (ultimoId, offerente, importo, idAsta);
                            offerte.put(ultimoId, nuovaOfferta);
                            break;
                        }
                    }
                }
            }
            db.commit();
            db.close();
            return 1;
        }
    No, come non detto: per un po' sembrava andar bene ma inserendo nuove aste qualcosa non quadra.
    Non capisco perché
    Ultima modifica di Jamie04; 30-01-2018 a 15:51

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Mi sono accorta che man mano che inserisco le offerte ecco cosa succede: al primo inserimento ne inserisce 1. Al secondo inserimento ne inserisce 2. Al terzo inserimento ne inserisce 4. Al quarto inserimento ne inserisce 8. Al quinto inserimento ne inserisce 16, e così via.
    Appena inserisco una nuova asta, per quelle precedenti non riesco più ad inserire un'offerta, si ferma sempre a questo controllo qui:
    if (key1.getOfferta() != null && key.getOfferta() >= importo)
    qualunque sia l'importo che inserisco.

    Avrei anche capito perché fa gli inserimenti multipli. Perché quando arriva qui:
    (key.getIdAsta() == idAsta)

    ripete l'inserimento per ogni riga di Offerte che soddisfa quella condizione, essendo l'istruzione
    in un ciclo for.
    Dove sbaglio?
    Mi resta oscuro perché non mi fa inserire offerte per le aste precedenti all'ultima.
    Ultima modifica di Jamie04; 30-01-2018 a 19:12

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Per completezza questo è il metodo che si occupa dell'inserimento di una nuova asta:

    codice:
        public Integer aggiungiAsta(String categoria, String utente, String nomeOggetto, String descrizione, 
                Double prezzoBase, Date dataIns, Date scadenza) throws IllegalArgumentException {
    
            //Inizializzo la chiave di asta e di offerte
            int ultimoID = 0;
            int ultimoIdOfferte = 0;
    
            DB db = DBMaker.newFileDB(new File(FILE_NAME)).closeOnJvmShutdown().make();
            ConcurrentNavigableMap<Integer, Asta> aste = db.getTreeMap("aste");
    
            // Controllo se la tabella delle aste nel database e' vuota
            if (aste.lastEntry() == null) {
                ultimoID = 1;
            }
            // se non lo e' estraggo id da assegnare
            else {
                ultimoID = aste.lastKey();
            }
            
            //creo i valori di default dei dati che non vengono passati dal metodo
            Boolean statoAsta = true; //true vuol dire asta aperta
    
            //controllo che non vengano passati valori null nei campi fondamentali
            if (categoria==null || categoria=="" || utente== null || utente=="" || scadenza==null || nomeOggetto==null || nomeOggetto=="") {
                return 2; 
                //controllo che il prezzo non sia assente o 0
            } else if (prezzoBase==null || prezzoBase==0.00) {
                return 0;
                //controllo che la data di scadenza non sia precedente a quella odierna
            } else if (scadenza.before(new Date())) {
                return 3;
            } else {
                //se tutto corretto incremento la chiave e creo  l'asta aggiungendola al db
                ultimoID++; 
                Asta asta = new Asta (ultimoID, utente, nomeOggetto, descrizione, categoria, prezzoBase, dataIns, scadenza, statoAsta);
                aste.put(ultimoID, asta);
                
                //all'inserimento di una nuova asta inserisco anche una nuova offerta pari al prezzo base
                ConcurrentNavigableMap<Integer, Offerta> offerte = db.getTreeMap("offerte");
                // Controllo se la tabella delle offerte nel database e' vuota
                if (offerte.lastEntry() == null) {
                    ultimoIdOfferte = 1;
                }
                // Altrimenti estraggo ID da assegnare
                else {
                    ultimoIdOfferte = offerte.lastKey();
                }
                //incremento anche la chiave per le offerte e creo una nuova offerta corrispondente al prezzoBase
                ultimoIdOfferte++;
                //creo la data di inserimento
                Date today=new Date();
                Offerta offerta = new Offerta(ultimoIdOfferte, utente, prezzoBase, ultimoID, today);
                offerte.put(ultimoIdOfferte, offerta);
    
                db.commit();
                db.close();
                return 1; //asta inserita correttamente
            }
        }

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Dovrei aver risolto:

    codice:
            for (Offerta key : offerte.values()) {
                
                if (key.getIdAsta() == idAsta && key.getOfferta()!=null) {
                    for (Offerta key1 : offerte.values()) {
                        if (key1.getIdAsta() == idAsta && key1.getOfferta() >= importo) {
                            return 0;
                        }
                    }
                    //se tutto corretto inserisco la nuova offerta
                    ultimoId++;
                    Offerta nuovaOfferta = new Offerta (ultimoId, offerente, importo, idAsta, today);
                    offerte.put(ultimoId, nuovaOfferta);
                    break;
                }
            }
            db.commit();
            db.close();
            return 1;
    Ho fatto molte prove e mi pare vada bene tutto. Che ne pensate? Mi ha fatto penare questa cosa...

  8. #8
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    .....Che ne pensate? Mi ha fatto penare questa cosa...
    Che è inutile fare 2 for fondamentalmente UGUALI quando puoi usare degli if....è spreco di risorse e cicli macchina, perché se hai due/tre aste va bene, ma se ne hai 100.000?
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    Che è inutile fare 2 for fondamentalmente UGUALI quando puoi usare degli if....è spreco di risorse e cicli macchina, perché se hai due/tre aste va bene, ma se ne hai 100.000?
    Ma era quello che stavo facendo all'inizio, un solo ciclo for, solo che non andava bene, perché si fermava non appena incontrava la prima offerta per quell'asta e quindi faceva il confronto solo col prezzo base. Io ho bisogno che il confronto con l'importo lo faccia per tutte le offerte inserite per quell'asta. Se puoi dirmi come modificarlo per farlo con un solo ciclo, te ne sarò grata.

  10. #10
    Quote Originariamente inviata da Jamie04 Visualizza il messaggio
    Il primo if, ovvero quello che controlla se l'id dell'asta (idAsta) passato dal metodo corrisponde all'id di un'asta presente in offerte, dovrebbe dirmi se per l'asta che ho selezionato esiste già un'offerta inserita. Questo dovrebbe risultare sempre vero visto che ad ogni inserimento di un'asta viene inserita anche una nuova offerta pari al prezzo base.
    if (key.getIdAsta() == idAsta) { //sempre vero?!?
    E allora perché lo metti?
    se è sempre vero non c'è bisogno di mettere un if
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

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.