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

    [JAVA]Inserire oggetti in un vector con condizioni riguardanti attributi G.Calendar

    E sono ancora qua, dopo il valido aiuto che mi avete dato nel topic precedente.
    Ora che ho un metodo per ordinare un vector di oggetti secondo il loro attributo GregorianCalendar (dal più antico al più recente), devo ideare un metodo che mi permetta di inserire oggetti (che hanno due attributi GregorianCalendar: dataInizio e dataFine) nel vector se e solo se non sono contemporanei agli altri oggetti già inseriti(completamente o anche parzialmente) Ad esempio, per farvi capire:
    Ho Obj1 con dataInizio=1/1/2005 e dataFine 6/1/2005
    Ho Obj2 con dataInizio=6/1/2006 e dataFine 6/8/2006
    Ho Obj3 con dataInizio=9/9/2006 e dataFine 10/12/2006
    Il metodo mi deve poter far inserire un obj4 con dataInizio 2/12/2003 e dataFine 6/12/2003 oppure un Obj4 con dataInizio 12/5/2010 e dataFine 19/6/2010 perché il primo è precedente a tutti gli altri oggetti già inseriti mentre il secondo è successivo a tutti. Ma anche mi deve poter far inserire un Obj4 con dataInizio 6/6/2005 e dataFine 8/11/2005 perchè esso occupa uno spazio temporale ancora "libero", tra Obj1 e Obj2.
    Invece, non deve lasciarmi inserire, ad esempio un Obj4 con dataInzio 15/9/2006 e dataFine 30/11/2006 (completamente in contemporanea a Obj3) o anche Obj4 con dataInizio 5/8/2006 e dataFine 9/8/2006 (parzialmente in contemporanea con Obj2).
    Scusate se mi sono dilungato ma voglio farvi capire bene cosa dovrebbe fare questo metodo. Un altra cosa: fate conto che il vector, quando si inserisce un oggetto, sia sempre ordinato dal più antico al più recente.
    Ecco il codice che ho realizzato:
    codice:
    [...] // inserimento dati dell'oggetto
    
    boolean cont3=false;
    
    int dim=vector.size();
    				
    				
     // if necessario solo se gli eventi già inseiri nel vector sono 1 o più (se il vector è vuoto l'inserimento dell'oggetto è certo)
    			
    			if(dim>0){
    
    //controllo se l'oggetto è successivo a tutti gli altri eventi
    				Oggetto locale=vector.get(dim-1); // prende l'ultimo elemento del vector
    				GregorianCalendar _inizio,_fine;
    				_fine=locale.getDataFine();
    					
    				if(dataInizio.compareTo(_fine)>0)
    					cont3=true;
    				else
    					cont3=false;
    					
    				if(dim>1 && cont3==false){
    
    // ciclo while che controlla se è libero lo spazio tra due eventi, necessario se gli eventi sono almeno 2
    
    					int i=dim-2;
    					while(i!=1 && cont3==false){
    						locale=vector.get(i);
    						_fine=locale.getDataFine();
    						_inizio=vector.get(i+1).getDataInizio();
    						if(dataInizio.compareTo(_fine)>0 && dataFine.compareTo(_inizio)<0)
    							cont3=true;
    						else
    							cont3=false;
    						i--;
    					};
    					
    				}// chiusura if dim>1
    
    // se ancora cont3=false, potrebbe essere che l'oggetto sia precedente a tutti gli altri:
    					
    				    locale=vector.get(0);
    				    _inizio=locale.getDataInizio();
    						
    					  if(dataFine.compareTo(_inizio)<0)
    						  cont3=true;
    						
    		
    				} // chiusura dell'if dim>0
    				
    				else
    					cont3=true;
    				
    				if(cont3==false)
    					System.out.printf(ERRORE_PERIODO);
    
    [...]/inserimento nel vector se cont3=true oppure si riavvia il ciclo chiedendo nuovi dati
    Il problema è che il metodo non funziona sempre, mi lascia sempre inserire eventi successivi o precedenti a tutti gli altri ma quando si tratta di inserire oggetti "incastrati" tra gli altri già inseriti non sempre me lo permette ma mi presenta il messaggio ERRORE_PERIODO, evidentemente perchè cont3 rimane false.



    Grazie in anticipo!

  2. #2
    Praticamente se ho capito bene ti basta sapere se la nuovaDataInizio e la nuovaDataFine sono precedenti ad ogni dataInizio già presente in lista (il controllo sulla dataFine non è necessario... dato che si presuppone che la dataFine di ogni elemento sia precedente alla dataInizio del successivo...)

    Codice PHP:
    boolean okInsert true;
    for(
    Oggetto obj listaOggetti){
       if(!(
    obj.getDataInizio().compareTo(nuovoOggetto.getDataInizio()) > && obj.getDataInizio().compareTo(nuovoOggetto.getDataFine()) > 0)){
          
    okInsert false;
          break;
    }

    if(
    okInsert){
       
    //aggiungi
    }else{
       
    //fai qualche altra cosa

    Al mio segnale... scatenate l'inferno!

  3. #3
    mi sa che non mi sono spiegato bene

    Se ho capito bene con il codice che hai scritto, ad esempio, l'oggetto con dataInizio e dataFine 5/5/2005 e 16/5/2005 non me lo lascia inserire. Invece dovrebbe perchè, riprendendo i dati di esempio, occupa uno spazio temporale libero tra obj1 e obj2.

    Il mio problema è proprio questo: con il mio metodo non ho problemi ad inserire oggetti precedenti ad ogni oggetto già inserito o oggetti successivi a tutti gli altri...quando invece voglio inserire un oggetto "di mezzo" a volte non me lo fa inserire e non so perchè. Non so dove sbaglio :S

    Il tuo metodo, da quello che ho capito, controlla solo se un evento è precedente a tutti gli altri e se sì me lo lascia inserire. Invece deve lasciarmi inserire anche eventi "in mezzo" a due o successivi a tutti.

    Una precisazione: la nuovaDataFine è sempre successiva alla nuovaDataInizio e quindi
    se obj.getDataInizio().compareTo(nuovoOggetto.getData Inizio()) > 0 ovviamente anche obj.getDataInizio().compareTo(nuovoOggetto.getData Fine()) > 0

    UPDATE: la mia idea, come puoi vedere dal metodo che ho scritto io, era quella che, dato un oggetto già inserito di posizione i, la nuovaDataInizio dovesse essere successiva alla dataFine di vector.get(i) e la nuovaDataFine dovesse essere precedente alla dataInizio dell'oggetto successivo vector.get(i+1). Non è corretta come idea di fondo?
    Tutto questo supponendo che l'oggetto occupi uno spazio tra due eventi già inseriti. Se è successivo o precedente a tutti, non ho problemi, quel pezzo di codice credo proprio sia ok.

    codice:
    while(i!=1 && cont3==false){
    				locale=vector.get(i);
    				_fine=locale.getDataFine();
    				_inizio=vector.get(i+1).getDataInizio();
    				if(dataInizio.compareTo(_fine)>0 && dataFine.compareTo(_inizio)<0)
    					cont3=true;
    				else
    					cont3=false;
    				i--;
    };
    Questo pezzetto di codice mi dovrebbe controllare se un oggetto occupa uno spazio intramezzo due oggetti già inseriti e non si accavalla con altri...

  4. #4
    Hai ragione scusa... ho sbagliato io la condizione di uscita dal for:

    Codice PHP:
    boolean okInsert false;
    for(
    Oggetto obj listaOggetti){
       if(
    obj.getDataInizio().compareTo(nuovoOggetto.getDataInizio()) > && obj.getDataInizio().compareTo(nuovoOggetto.getDataFine()) > 0){
          
    okInsert true;
          break;
    }

    if(
    okInsert){
       
    //aggiungi
    }else{
       
    //fai qualche altra cosa

    In questo modo:

    Oggetto1: 01/01/2001 01/02/2001
    Oggetto2: 01/05/2001 01/07/2001
    Oggetto3: 01/09/2001 01/12/2001

    NuovoOggetto1: 01/03/2001 01/04/2001 <--- te lo fa inserire
    NuovoOggetto2: 01/08/2001 01/11/2001 <--- non te lo fa inserire (conflitto con Oggetto3)
    Al mio segnale... scatenate l'inferno!

  5. #5
    non credo di capire ancora

    Prendiamo NuovoOggetto1: 01/03/2001 01/04/2001

    Facciamo partire il ciclo for:
    con Oggetto1: 01/01/2001 01/02/2001
    01/01/2001>1/03/2001 No
    01/01/2001>01/04/2001 No
    Quindi okInsert = false

    con Oggetto2: 01/05/2001 01/07/2001
    01/05/2001>1/03/2001 Sì
    01/05/2001>01/04/2001 Sì
    okInsert = true e quindi, come hai detto tu, me lo inserisce.

    Ma se fosse NuovoOggetto1: 20/12/2000 15/01/2001
    con Oggetto1: 01/01/2001 01/02/2001
    01/01/2001>20/12/2000 sì
    01/01/2001>15/01/2001 No
    Quindi okInsert = false

    Ma con con Oggetto2: 01/05/2001 01/07/2001
    01/05/2001>20/12/2000 Sì
    01/05/2001>15/01/2001 sì
    Quindi okInsert = true e mi inserisce pure questo che invece è in conflitto con Oggetto1 no?

    Stessa cosa ad esempio per 3/1/2001 15/1/2001.
    sono io che non ho ancora capito il tuo metodo?

  6. #6
    Originariamente inviato da Ghiozzo
    sono io che non ho ancora capito il tuo metodo?
    No, sono io che all'1:20 di Sabato sera sono un pò fuso e non avevo considerato questa eventualità

    Ok... solo quel controllo non basta. Con il controllo che ho fatto io si verifica che il range nuovadatInizio/nuovaDataFine sia esterno ad ogni singolo range. Verificato ciò è necessario poi controllare che solo nuovaDataFine non ricada in un intervallo già presente:

    Codice PHP:
    boolean okInsert false;
    for (
    Oggetto obj listaOggetti) {
                if (
    obj.getDataInizio().compareTo(nuovoOggetto.getDataInizio()) > && obj.getDataInizio().compareTo(nuovoOggetto.getDataFine()) > 0) {
                    
    okInsert true;
                    break;
                }
    }
    if (
    okInsert) {
                
    //superato primo controllo
                
    for (Oggetto obj listaOggetti) {
                    if (
    obj.getDataInizio().compareTo(nuovoOggetto.getDataFine()) < && obj.getDataFine().compareTo(nuovoOggetto.getDataFine()) > 0) {
                        
    okInsert false;
                        break;
                    }
                }


    }
    if (
    okInsert) {
                ...
    } else {
                ...

    Così dovrebbe andare... sperando non mi sia sfuggito altro
    Al mio segnale... scatenate l'inferno!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.