Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [JAVA] Metodo riordinamento vector di oggetti

    Ho un vector di oggetti. Ogni oggetto ha un attributo GregorianCalendar che rappresenta una data, DataInizio. Quello che voglio fare è ordinare gli oggetti del vector in base alla loro dara: dalla data più antica alla più recente.

    Il metodo che ho ideato è il seguente:
    codice:
    	public static Vector<oggetto> ordinaOggetti(Vector<oggetto>e){
    		Vector<oggetto>locale=new Vector<oggetto>();
    		
    		do{
    			GregorianCalendar data1=e.get(0).getDataInizio();
    			int indice=0;
    		
    			for(int k=0;k<e.size();k++){
    				GregorianCalendar data2=e.get(k).getDataInizio();
    				if(data2.compareTo(data1)<0){
    					indice=k;
    					data1=e.get(k).getDataInizio();
    				}
    					
    			}
    			locale.add(e.get(indice));
    			e.remove(e.get(indice));
    			
    		}
    			while(e.size()!=0);
    			
    			return locale;
    	}
    la mia idea di fondo era quella di creare un nuovo vector di oggetti vuoto. Lavorare sul vector in ingresso (e) e, usando il metodo getDataInizio(che ritorna la data dell'oggetto), confrontare le date e individuare la meno recente. Alla fine del ciclo for, ho l'inidice dell'oggetto con la data meno recente, quindi: aggiungo l'oggetto di posizione indice al nuovo vector e rimuovo dal vector originale l'elemento. Ripeto così il ciclo finché il vector originario non abbia dimensione 0. Poi faccio ritornare il vettore che dovrebbe contenere tutti gli elementi ordinati.

    Il mio problema è che invece il vettore ritornato me lo ritrovo sempre di una dimensione e contenente solo l'ultimo oggetto inserito (mediante un metodo, corretto). Cosa c'è che non va?

    un altra domanda: la mia idea iniziale era di fare un metodo void che alla fine attribuisse il valore del nuovo Vector all'originale, ormai vuoto:

    e=locale;

    Ma così facendo mi ritrovavo un Vector di dimensione 0!

    Aiuto

  2. #2
    Ma devi necessariamente implementare tu l'algoritmo di ordinamento? Se no, allora puoi sfruttare il metodo sort della classe Collections. Questo metodo in una delle sue "forme" riceve come parametri la lista da riordinare è un Comparator. Il comparator è responsabile della comparazione tra due oggetti. Nel tuo caso puoi fare una cosa simile:

    Codice PHP:
    public class DataComparatorTester {

        public static 
    void main(String[] args) {
            
    Vector<Oggettooggetti = new Vector<Oggetto>();

            
    oggetti.add(new Oggetto(new GregorianCalendar(2010031)));
            
    oggetti.add(new Oggetto(new GregorianCalendar(2010110)));
            
    oggetti.add(new Oggetto(new GregorianCalendar(2010211)));

            
    Collections.sort(oggetti, new DataComparator());

            for (
    Oggetto oggetto oggetti) {
                
    System.out.println(oggetto.getDataOggetto().get(Calendar.DAY_OF_MONTH) + "/" oggetto.getDataOggetto().get(Calendar.MONTH) + "/" oggetto.getDataOggetto().get(Calendar.YEAR));
            }

        }
    }

    class 
    Oggetto {

        private 
    GregorianCalendar dataOggetto;

        public 
    Oggetto(GregorianCalendar dataOggetto) {
            
    setDataOggetto(dataOggetto);
        }

        public 
    GregorianCalendar getDataOggetto() {
            return 
    this.dataOggetto;
        }

        public 
    void setDataOggetto(GregorianCalendar value) {
            
    this.dataOggetto value;
        }
    }


    class 
    DataComparator implements Comparator<Oggetto>{

        public 
    int compare(Oggetto o1Oggetto o2) {
            
    //Ordinamento decrescente
            
    return o2.getDataOggetto().compareTo(o1.getDataOggetto());

            
    //ordinamento crescente
            //return o1.getDataOggetto().compareTo(o2.getDataOggetto());
        
    }




    Se servono chiarimenti fammi sapere
    Al mio segnale... scatenate l'inferno!

  3. #3
    si l'idea del comparetor è la migliore anche perchè così
    segui uno standar implementando qualcosa che rispecchia altre strutture..
    Ad esempio java possiede già implementati metodi di riordinamento per classi
    come Stringhe, Integer......
    Forse ce ne è già uno per le date (consulta la documentazione)
    altrimenti........ti tocca fartela hehe

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da lotus1989
    Ad esempio java possiede già implementati metodi di riordinamento per classi
    come Stringhe, Integer......
    Forse ce ne è già uno per le date (consulta la documentazione)
    altrimenti........ti tocca fartela hehe
    Per essere pignoli il metodo per l'ordinamento è uno (statico e generico): Collections.sort(). Ordina una collezione di qualsiasi cosa, purché quella "cosa" sia Comparable. E Date è-un Comparable.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Originariamente inviato da lotus1989
    Forse ce ne è già uno per le date (consulta la documentazione)
    Per essere pignoli il metodo per l'ordinamento è uno (statico e generico): Collections.sort(). Ordina una collezione di qualsiasi cosa, purché quella "cosa" sia Comparable. E Date è-un Comparable.
    Esattamente. E' propro quello che ho sfruttato nel mio esempio con la riga:

    Codice PHP:
    return o2.getDataOggetto().compareTo(o1.getDataOggetto()); 
    Al mio segnale... scatenate l'inferno!

  6. #6
    Grazie molte a R@ve M@ster ma anche a tutti gli altri!
    Ho inserito il codice adattandolo al programma e funziona alla grande!

    Vi ringrazio davvero!

    Ho solo una domanda...probabilmente ancora da programmatore alle prime armi quale sono:
    Il "riordinamento del vettore" è un metodo che ho inserito in una classe public non instanziabile che non è la "principale", cioè non c'è il main.
    Ho visto che alla classe DataComparator implementante non hai dato alcun attributo...perchè?E' sbagliato mettere public come tutti gli altri metodi della mia classe?

    UPDATE: qualcuno può dirmi anche se il mio metodo "rudimentale" era sbagliato concettualmente o sintatticamente...o se magari l'errore riscontrato era probabilmente dovuto ad altri pezzi di codice esterni al metodo(anche se mi sembra improbabile a questo punto visto che con il codice suggerito funziona tutto)

  7. #7
    Originariamente inviato da Ghiozzo
    Ho solo una domanda...probabilmente ancora da programmatore alle prime armi quale sono:
    Il "riordinamento del vettore" è un metodo che ho inserito in una classe public non instanziabile che non è la "principale", cioè non c'è il main.
    Cosa intendi con "non istanziabile"? Che non ha main? In questo caso non è il termine adatto. Per classe non istanziabile si intende una classe che non ha costruttori pubblici e che ne ha almeno uno privato (in modo che il costruttore public di default non venga "utilizzato"). Il fatto che non ci sia un main nella tua classe non vuol dire nulla. Io ho usato una classe eseguibile semplicemente per fare un esempio completo e funzionante. Ma il codice lì utilizzato può essere utilizzato ovunque.

    Ho visto che alla classe DataComparator implementante non hai dato alcun attributo...perchè?
    La classe DataComparator implementa l'interfaccia Comparator (approfondisci il concetto di interfaccia...). Una classe che implementa una interfaccia, deve definire il comportamento dei metodi astratti dichiarati nella interfaccia stessa che implementa. In questo caso, l'unico metodo è il compareTo(Object o1, Object o2). Tale metodo viene richiamato automaticamente dal metodo sort di Collections passandogli direttamente i due oggetti da confrontare. In questo caso nella classe dataComparator non c'è bisogno di ulteriori attributi, ma nulla vieterebbe di usarne se necessario. Si tratta di cmq di una normale classe, con l'unico vincolo che deve implementare il metodo compareTo.

    E' sbagliato mettere public come tutti gli altri metodi della mia classe?
    Questa non l'ho capita
    Al mio segnale... scatenate l'inferno!

  8. #8
    ok ok l'ultima domanda che non hai capito rientrava nella seconda e mi hai risposto.

    Comunque per "non istanziabile" non intendo una classe dove non ci sia il main...ma semplicemente una classe che non ha alcun costruttore pubblico e che per utilizzare i suoi metodi non ci sia bisogno, appunto, di istanziarla.

  9. #9
    Basta dichiarare il metodo static
    Al mio segnale... scatenate l'inferno!

  10. #10
    Bè..grazie ancora!

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.