Collezione di oggetti

di il
38 risposte

38 Risposte - Pagina 2

  • Re: Collezione di oggetti

    La difficolta' o dubbio sta nel capire se il filtro accetta una stanza come parametro e restituisce solo true/false oppure deve anche scorrere la lista...
    secondo me la prima opzione sarebbe quella giusta
  • Re: Collezione di oggetti

    antomau96 ha scritto:


    La difficolta' o dubbio sta nel capire se il filtro accetta una stanza come parametro e restituisce solo true/false oppure deve anche scorrere la lista...
    secondo me la prima opzione sarebbe quella giusta
    Ma il findRooms (come l'ho chiamato io) è OVVIO che dovrà fare le iterazioni necessarie: sugli Hotel e poi per ciascuno, sulle sue stanze. Quel "if" che ho messo nell'esempio prima userà quindi i dati di filtri (passati come parametri distinti oppure incapsulati in una unica classe) e quindi in base al risultato andrai a considerare o no quella stanza.

    Quindi quale è (ancora) il dubbio? Scusa se lo dico, vedo che ti piace il "C" ... ma se hai questi dubbi/problemi in Java, in C ne avrai almeno 40x
  • Re: Collezione di oggetti

    andbin ha scritto:


    Quindi quale è (ancora) il dubbio? Scusa se lo dico, vedo che ti piace il "C" ... ma se hai questi dubbi/problemi in Java, in C ne avrai almeno 40x


    La cosa bella e' che io il C oltre che a livello universitario l'ho studiato per passione perche' mi piace e ti giuro che problemi non ne ho propio... riesco ad implementare delle strutture impeccabili in pochissimo tempo...
    Il problema che ho con Java deriva dall'impatto iniziale che ho avuto e anche dal fatto che voi professionisti mi dite una cosa e all'uni vogliono il contrario...
    Allora, dimmi tu, se ti presenti ad un esame di Java, implementi un albero di ricerca bianaria e nel nodo ovviamente implementi il metodo printNodes() e ti viene contestata la println perche'
    facendo il programma il questo modo stai programmando in Java come si programma in C
    non ti cadono le braccia? Non ti passa la voglia di impegnarti in un qualcosa nel momento in cui chi dovrebbe insegnartela non sa neanche cosa stai facendo?

    Oppure, se io devo realizzare questo programma e la struttura piu' appropriata sono le mappe(dizionario) e ti viene detto che
    in questo caso le mappe non servono a niente
    tu cosa faresti?

    Chiusa questa parentesi l'ultimo mio dubbio e' come faccio a conciliare i risultati dei filtri?
    Non posso usare filtri nei filtri per il semplice fatto che non voglio usare per forza tutti i filtri contemporaneamente...
    La mia soluzione sarebbe una variabile che diventa 0 o null nel momento il cui uno dei filtri restituisce false.

    E avrei pensato all'oggetto stanza da aggiungere alla collezione restituita dal filtro,
    se uno dei filtri restituisce false allora faccio diventare la stanza null in maniera tale che non viene aggiunta ai risultati>
    [spero non sia qualcosa di trascendentale]
    
    public List roomFilter(boolean checkprice, int price)
    	{
    		List results = new List();
    		
    		ListIterator li = l.listIterator();
    		
    		while (li.hasNext())
    		{
    			Hotel h = li.next(); //hotel presente nella lista
    			
    			ArrayList<Room> rr = h.getRooms(); //arrayList del corrente hotel presente nella lista
    			
    			ArrayList<Room> filteredRooms = new ArrayList<Room>(); //arrayList di stanze filtrate
    			
    			for (Room r : rr)
    			{
    				//devo aggiungere un controllo sulle varie cose che voglio filtrare! non voglio applicare obligatoriamente tutti i filtri!
    				
    				Room roomResult = r;
    				
    				if (checkprice)
    				{
    					if (!findMinusPrice(r, price)) roomResult = null;
    					
    				}
    				
    				filteredRooms.add(roomResult);
    				
    			} //end of for
    			
    			h.setRooms(filteredRooms);
    			results.addFirst(h);
    		}
    		
    		return results;
    	}
    
  • Re: Collezione di oggetti

    In poche parole questo e' quello che e' venuto fuori...
    spero vada bene...
    
    public List roomFilter(boolean checkprice, int price, boolean checklargerprice, int largerprice, boolean checktv, boolean checkair, boolean checkfridge, boolean checkinternet)
    	{
    		List results = new List();
    		
    		ListIterator li = l.listIterator();
    		
    		while (li.hasNext())
    		{
    			Hotel h = li.next(); //hotel presente nella lista
    			
    			ArrayList<Room> rr = h.getRooms(); //arrayList del corrente hotel presente nella lista
    			
    			ArrayList<Room> filteredRooms = new ArrayList<Room>(); //arrayList di stanze filtrate
    			
    			for (Room r : rr)
    			{
    				//devo aggiungere un controllo sulle varie cose che voglio filtrare! non voglio applicare obligatoriamente tutti i filtri!
    				
    				Room roomResult = r;
    				
    				if (checkprice)
    				{
    					if (!findMinusPrice(r, price)) roomResult = null;	
    				}
    				
    				if (checklargerprice)
    					if (!findLargerPrice(r, largerprice)) roomResult = null;
    				
    				if (checktv)
    					if (!findTv(r)) roomResult = null;
    				
    				if (checkair)
    					if (!findAir(r)) roomResult = null;
    				
    				if (checkfridge)
    					if (!findFridge(r)) roomResult = null;
    				
    				if (checkinternet)
    					if (!findInternet(r)) roomResult = null;
    				
    				if (roomResult!=null)
    					filteredRooms.add(roomResult);
    				
    			} //end of for
    			
    			h.setRooms(filteredRooms);
    			results.addFirst(h);
    		}
    		
    		return results;
    	}
    	
    	
    	public boolean findMinusPrice(Room r, int p)
    	{
    		if (r.getPrice() <= p) return true;	
    		
    		return false;
    	}
    	
    	public boolean findLargerPrice(Room r, int p)
    	{
    		if (r.getPrice()>= p) return true;
    		return false;
    	}
    	
    	public boolean findTv(Room r)
    	{
    		return r.getTv();
    	}
    	
    	public boolean findAir(Room r)
    	{
    		return r.getAir();
    	}
    	
    	public boolean findFridge(Room r)
    	{
    		return r.getFridge();
    	}
    	
    	public boolean findInternet(Room r)
    	{
    		return r.getInternet();
    	}
    
  • Re: Collezione di oggetti

    C'e' sempre un errore che faccio che ormai mi perseguita ma non riesco a capire di quale concetto di Java si tratta
    presumendo che io abbia la variabile Room r
    se faccio
    Room r2 = new Room();
    r2 = r;
    Assumono lo stesso indirizzo di memoria e pertanto se faccio
    r2 = null;
    anche r diventa null...
    Quale concetto e'? vorrei studiare approfonditamente il problema

    Avevo pensato di creare il metodo getObject nella classe Room
    ma non credo che sia il caso migliore per risolvere il problema...
  • Re: Collezione di oggetti

    antomau96 ha scritto:


    La cosa bella e' che io il C oltre che a livello universitario l'ho studiato per passione perche' mi piace e ti giuro che problemi non ne ho propio... riesco ad implementare delle strutture impeccabili in pochissimo tempo...
    In C non hai un garbage collector, devi essere attentissimo e accuratissimo nella gestione della memoria. I "memory leak" sono sempre dietro l'angolo.

    In C non hai "collezioni" già fatte, perlomeno non nella libreria standard. Bisognerebbe cercare librerie esterne, chiaramente da valutare.

    In C la libreria "standard" è davvero misera, molte funzioni, specialmente quelle per la formattazione e gestione delle stringhe sono da usare molto con i guanti. I "buffer overflow" sono sempre dietro l'angolo. E riguardo le stringhe, per lo standard Unicode ... buonanotte.

    In C non c'è una gestione degli errori "coerente". Ogni API/libreria di funzioni fornisce informazioni sugli errori come cavolo gli pare. Chi usa valori particolari int di ritorno, chi usa variabili "globali", chi mette a disposizione una funzione per ottenere "l'ultimo errore", ecc... In generale è un casino unificare queste cose, specialmente se devi/vuoi creare degli "strati" software buoni che racchiudono usi di API/librerie differenti.

    In C è facile molto riusare funzioni già fatte ma è difficilissimo (se non impossibile) specializzare, estendere qualcosa di già fatto (in particolare da "altri"). E questo perché ovviamente non esistono meccanismi di ereditarietà/polimorfismo/override ecc.. come nei linguaggi ad oggetti.

    Se tu dici che per te è "facile", presumo sia perché hai fatto solo esercizietti basilari e NON hai affrontato in modo ampio e più completo gli argomenti che ho appena citato.

    antomau96 ha scritto:


    Chiusa questa parentesi l'ultimo mio dubbio e' come faccio a conciliare i risultati dei filtri?
    Non posso usare filtri nei filtri per il semplice fatto che non voglio usare per forza tutti i filtri contemporaneamente...
    La mia soluzione sarebbe una variabile che diventa 0 o null nel momento il cui uno dei filtri restituisce false.
    Ma io prima ho anche detto che puoi passare oggetti es. Integer, Boolean. Così un null può essere trattato come "ignora questo dato di filtro".
  • Re: Collezione di oggetti

    andbin ha scritto:


    In C non hai un garbage collector, devi essere attentissimo e accuratissimo nella gestione della memoria. I "memory leak" sono sempre dietro l'angolo.

    In C non hai "collezioni" già fatte, perlomeno non nella libreria standard. Bisognerebbe cercare librerie esterne, chiaramente da valutare.

    In C la libreria "standard" è davvero misera, molte funzioni, specialmente quelle per la formattazione e gestione delle stringhe sono da usare molto con i guanti. I "buffer overflow" sono sempre dietro l'angolo. E riguardo le stringhe, per lo standard Unicode ... buonanotte.

    In C non c'è una gestione degli errori "coerente". Ogni API/libreria di funzioni fornisce informazioni sugli errori come cavolo gli pare. Chi usa valori particolari int di ritorno, chi usa variabili "globali", chi mette a disposizione una funzione per ottenere "l'ultimo errore", ecc... In generale è un casino unificare queste cose, specialmente se devi/vuoi creare degli "strati" software buoni che racchiudono usi di API/librerie differenti.

    In C è facile molto riusare funzioni già fatte ma è difficilissimo (se non impossibile) specializzare, estendere qualcosa di già fatto (in particolare da "altri"). E questo perché ovviamente non esistono meccanismi di ereditarietà/polimorfismo/override ecc.. come nei linguaggi ad oggetti.

    Se tu dici che per te è "facile", presumo sia perché hai fatto solo esercizietti basilari e NON hai affrontato in modo ampio e più completo gli argomenti che ho appena citato.
    Che a livello professionale Java sia piu' semplice di C e' un dato di fatto. Tuttavia per il mio schema mentale che prevede il pieno controllo di tutto preferisco, e per quello che io abbia fatto, preferisco allocare memoria in ogni dove piuttosto che avere gia' tutto fatto... Probabilmente saro' alle prime armi ma sono fatto cosi'... ad esempio mi intrigano linguaggi come Assembly che per la maggior parte delle persone sono bestie nere.

    andbin ha scritto:


    Ma io prima ho anche detto che puoi passare oggetti es. Integer, Boolean. Così un null può essere trattato come "ignora questo dato di filtro".
    Sono talmente stressato che certe soluzioni chiare e limpide non le riesco neanche a considerare

    Chiedo venia per tutta la pazienza che ti sto esaurendo
  • Re: Collezione di oggetti

    Visto che Java, come al solito, preferisce la semplicità alla potenzialità devo creare due variabili con lo stesso oggetto ma che non si riferiscano al medesimo oggetto...

    In pratica Java sfrutta il procedimento di sinistra quando si fa
    Hotel x = new Hotel(.....);
    Hotel j = x;
    Come faccio ad ottenere il risultato di destra cioè non referenziare l'oggetto ma ottenerne una copia?

    Devo implementare il metodo clone()?

    Oppure basta una cosa macchinosa come
    
    Hotel x = new Hotel(.....);
    Hotel j = new Hotel (x.getSerial(), x.getName(), .....);
    
  • Re: Collezione di oggetti

    antomau96 ha scritto:


    Che a livello professionale Java sia piu' semplice di C e' un dato di fatto. Tuttavia per il mio schema mentale che prevede il pieno controllo di tutto preferisco, e per quello che io abbia fatto, preferisco allocare memoria in ogni dove piuttosto che avere gia' tutto fatto...
    Non è tanto questione di "controllo" (in particolare della memoria) che in certi contesti può anche essere appropriato e fondamentale.
    Ci sono altre questioni che riguardano più i principi di sviluppo del software in generale. In C come ho detto la gestione degli errori è un gran casino. Certe funzioni possono dare 0 per fallimento e diverso da 0 per successo, altre possono dare 0 per successo e 1,2,3.... per certi errori specifici. In ambito Win32 certe funzioni danno un BOOL e se è false ha fallito e puoi sapere l'errore preciso solo andando a chiamare la famosa funzione GetLastError().
    Perché perdere tempo con tutte queste menate??

    Ti dico solo questo: ho svariati anni di esperienza con il C e almeno 8 anni di esperienza con Java. Se mi chiedessero di tornare a lavorare con il C .... NON ci torno!
  • Re: Collezione di oggetti

    https://www.iprogrammatori.it/forum-programmazione/java/copia-oggetto-tipo-generico-t29967.html

    Credo proprio che dovrò usare

    antomau96 ha scritto:


    
    Hotel x = new Hotel(.....);
    Hotel j = new Hotel (x.getSerial(), x.getName(), .....);
    

    Non è un po' troppo grezza come soluzione:
    
    public List roomFilter(int price, int largerprice, boolean checktv, boolean checkair, boolean checkfridge, boolean checkinternet)
    	{
    		List results = new List();
    		
    		ListIterator li = l.listIterator();
    		
    		while (li.hasNext())
    		{
    			Hotel h = li.next(); //hotel presente nella lista
    			
    			Hotel hotelResult = new Hotel(h.getSerial(), h.getName(), h.getAddress(), h.getCity(), h.getCountry(), h.getPhone(), h.getFax());
    			
    			ArrayList<Room> rr = h.getRooms(); //arrayList del corrente hotel presente nella lista
    			
    			ArrayList<Room> filteredRooms = new ArrayList<Room>(); //arrayList di stanze filtrate
    			
    			for (Room r : rr)
    			{
    				//devo aggiungere un controllo sulle varie cose che voglio filtrare! non voglio applicare obligatoriamente tutti i filtri!
    				
    				Room roomResult = new Room(r.getType(), r.getNum(), r.getPrice(), r.getTv(), r.getAir(), r.getFridge(), r.getInternet());
    				
    				if (price!=0)
    				{
    					if (!findMinusPrice(r, price)) roomResult = null;
    				}
    				
    				if (largerprice!=0)
    					if (!findLargerPrice(r, largerprice)) roomResult = null;
    				
    				if (checktv)
    					if (!findTv(r)) roomResult = null;
    				
    				if (checkair)
    					if (!findAir(r)) roomResult = null;
    				
    				if (checkfridge)
    					if (!findFridge(r)) roomResult = null;
    				
    				if (checkinternet)
    					if (!findInternet(r)) roomResult = null;
    				
    				if (roomResult!=null)
    					filteredRooms.add(roomResult);
    				
    			} //end of for
    			
    			hotelResult.setRooms(filteredRooms);
    			results.addFirst(hotelResult);
    		}
    		
    		return results;
    	}
    	
    	
    	public boolean findMinusPrice(Room r, int p)
    	{
    		if (r.getPrice() <= p) return true;	
    		
    		return false;
    	}
    	
    	public boolean findLargerPrice(Room r, int p)
    	{
    		if (r.getPrice()>= p) return true;
    		return false;
    	}
    	
    	public boolean findTv(Room r)
    	{
    		return r.getTv();
    	}
    	
    	public boolean findAir(Room r)
    	{
    		return r.getAir();
    	}
    	
    	public boolean findFridge(Room r)
    	{
    		return r.getFridge();
    	}
    	
    	public boolean findInternet(Room r)
    	{
    		return r.getInternet();
    	}
    
    ?
  • Re: Collezione di oggetti

    antomau96 ha scritto:


    https://www.iprogrammatori.it/forum-programmazione/java/copia-oggetto-tipo-generico-t29967.html
    Quella discussione c'entra praticamente quasi niente. Tra l'altro l'utente era un tantino fuori strada ....

    antomau96 ha scritto:


    
    Hotel x = new Hotel(.....);
    Hotel j = new Hotel (x.getSerial(), x.getName(), .....);
    
    Sì, una possibilità è un costruttore che riceve i dati base (senza stanze) del hotel. Ma non è l'unica soluzione. Un'altra anche più pulita è mettere proprio in Hotel un metodo es. copyWithoutRooms() che restituisce un NUOVO Hotel con gli stessi dati ma senza stanze.

    La questione del clone() "ufficiale" degli oggetti, sì, è anche possibile. Ma bisogna anche valutare che questo è il clone generale e si dovrebbe quindi valutare se fare una shallow o deep copy del Hotel.

    antomau96 ha scritto:


    Non è un po' troppo grezza come soluzione
    Sì, è abbastanza "grezza", prolissa e un po' bruttina come soluzione. E tra l'altro c'è anche una questione concettuale: se per i vari filtri NESSUNA stanza di un certo hotel è considerata, nella lista in uscita vuoi mettere quel hotel senza stanze ... o no? Io non lo metterei, non ha granché senso.
    Quindi servirebbe fare un pelino diversamente.


    E comunque, visto che puoi usare i generics, sfruttali in modo consistente e anche il for-each.
  • Re: Collezione di oggetti

    andbin ha scritto:


    E tra l'altro c'è anche una questione concettuale: se per i vari filtri NESSUNA stanza di un certo hotel è considerata, nella lista in uscita vuoi mettere quel hotel senza stanze ... o no? Io non lo metterei, non ha granché senso.
    Quindi servirebbe fare un pelino diversamente.
    Si quella parte l'ho aggiustata e l'avevo scritta così troppo generalizzata solamente per testare il metodo... adesso ho aggiunto un if che verifica se l'arraylist è vuoto e in tal caso non aggiunge l'hotel

    andbin ha scritto:


    Un'altra anche più pulita è mettere proprio in Hotel un metodo es. copyWithoutRooms() che restituisce un NUOVO Hotel con gli stessi dati ma senza stanze.
    Credo che utilizzerò questa soluzione implementata così...
    
    public Hotel copyWithoutRooms()
    	{
    		return new Hotel(this.serial, this.name, this.address, this.city, this.country, this.phone, this.fax);
    	}
    
    va bene?

    andbin ha scritto:


    e anche il for-each.
    Ma non l'ho già usato in
    
    for (Room r : rr)
    
    ?
  • Re: Collezione di oggetti

    antomau96 ha scritto:


    
    public Hotel copyWithoutRooms()
    	{
    		return new Hotel(this.serial, this.name, this.address, this.city, this.country, this.phone, this.fax);
    	}
    
    va bene?
    Ok. (puoi anche omettere quei this )

    antomau96 ha scritto:


    Ma non l'ho già usato in
    
    for (Room r : rr)
    
    ?
    Ma non per gli hotel.
  • Re: Collezione di oggetti

    andbin ha scritto:


    Ma non per gli hotel.
    Ma per gli hotel avendo una lista concatenata non e' meglio scorrerla con un iteratore+while come ho fatto io? Oppure sarebbe piu' corretto il foreach anche in questo caso?
  • Re: Collezione di oggetti

    antomau96 ha scritto:


    andbin ha scritto:


    Ma non per gli hotel.
    Ma per gli hotel avendo una lista concatenata non e' meglio scorrerla con un iteratore+while come ho fatto io? Oppure sarebbe piu' corretto il foreach anche in questo caso?
    Il for-each (escludendo ora l'uso con gli array) fa praticamente la stessa cosa che la iterazione con il Iterator esplicito. Non c'è alcuna differenza.
    Se devi per qualche motivo usare espressamente il remove() del Iterator, allora è un conto e devi usare per forza il Iterator esplicitamente. Ma se non serve il remove(), usare il Iterator non ti dà alcun vantaggio sul for-each che invece è più compatto.
Devi accedere o registrarti per scrivere nel forum
38 risposte