[Java] Cicli for annidati, la mia nemesi
Mi aiutate a capire perché questo metodo non fa quello che mi aspetto che faccia? La mia necessita' è di inserire una nuova offerta per un'asta esistente. Quando viene creata un'asta creo anche una prima offerta con il prezzo base. Per inserire un'offerta devo controllare che nel db delle offerte ci sia quell'asta (lo faccio dal controllo sull'idAsta) e che l'offerta sia superiore al prezzo base o all'ultima offerta inserita. Questo metodo se provato su una nuova asta sembra funzionare, eccetto per il fatto che ad ogni inserimento di un'offerta mi inserisce un numero di offerte pari a potenze di 2 (relativamente al numero di offerte che sono già presenti per quell'asta). Cioè: al primo inserimento, inserisce 1 offerta, al secondo 2, al terzo 4, al quarto 8, al quinto 16 e così via.
Quando però si inserisce un'altra asta, per tutte le aste precedenti il metodo non permette piu' di inserire nessuna offerta, qualunque sia l'importo, e questo proprio non lo capisco. Il primo problema penso sia dovuto ai cicli for annidati, che non ho mai saputo padroneggiare a dovere. Il secondo proprio non lo capisco. Per meglio inquadrare la situazione in basso posto anche il metodo completo che inserisce una nuova asta.
Infinite grazie a chiunque vorrà aiutarmi.
Quando però si inserisce un'altra asta, per tutte le aste precedenti il metodo non permette piu' di inserire nessuna offerta, qualunque sia l'importo, e questo proprio non lo capisco. Il primo problema penso sia dovuto ai cicli for annidati, che non ho mai saputo padroneggiare a dovere. Il secondo proprio non lo capisco. Per meglio inquadrare la situazione in basso posto anche il metodo completo che inserisce una nuova asta.
Infinite grazie a chiunque vorrà aiutarmi.
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, today); offerte.put(ultimoId, nuovaOfferta); break; } } } } db.commit(); db.close(); return 1;
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 } }
Risposte
Dovrei aver risolto, così:
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;