[Java] Cicli for annidati, la mia nemesi

EveyH
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.

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
EveyH
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;

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.