Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
Abbiamo partecipato all'OVHcloud Summit 2025, conferenza annuale in cui l'azienda francese presenta le sue ultime novità. Abbiamo parlato di cloud pubblico e privato, d'intelligenza artificiale, di computer quantistici e di sovranità. Che forse, però, dovremmo chiamare solo "sicurezza"
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Abbiamo potuto mettere le mani in anteprima sul nuovo monitor MSI dedicato ai giocatori: un mostro che adotta un pannello QD-OLED da 26,5 pollici con risoluzione 2560 x 1440 pixel, frequenza di aggiornamento fino a 500 Hz e tempo di risposta di 0,03 ms GtG
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI aggiorna la sua linea di droni ultraleggeri con Neo 2, un quadricottero da 160 grammi che mantiene la compattezza del predecessore ma introduce una stabilizzazione meccanica a due assi, sensori omnidirezionali e un sistema LiDAR
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-05-2009, 21:05   #1
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
[JAVA] Quesito sugli iteratori

Ciao,
studiando Java sono arrivato a vedere gli iteratori...vi faccio qualche domanda relativa ad un esempio giocattolo fatto dalla professoressa.

Da quello che ho capito uso il meccanismo degli iteratori per poter scorrere collezioni di oggetti in modo standard per tutti i tipi di collezioni senza dover scendere a basso livello (per esempio impostando un ciclo per scorrere un array o una lista concatenata).

Così quando progetto una collezione di oggetti posso cacciarci dentro una particolare implementazione dell'interface Iterator e chi userà la classe che implementa quella collezione avrà gratis un modo standard per scorrere la collezione....è giusto come concetto del perchè si usano gli iteratori?

Veniamo all'esempio fatto in classe:
Codice:
public class CollStr{	// Classe che gestisce una collezione di stringhe

	private String[] c;	// Variabile di istanza: la collezione di stringhe è gestita banalmente da un array di stringhe
	int i;
	
	public CollStr(String str[]){	// COSTRUTTORE
		// COSTRUISCE L'ARRAY c CHE IMPLEMENTA LA COLLEZIONE IN QUALCHE MODO
	}
	
	private class MioIteratore implements Iterator{		// E' una CLASSE INTERNA che implementa l'interface Iterator
		
		private int dove;
		
		public MioIteratore(){		// COSTRUTTORE MioIterator
			dove = 0;				// Punta al primo elemento dell'array
		}
		
		public Object next(){		// Restituisce l'elemento non ancora estratto
			return c[dove];
		}
		
		public void remove(){
			dove ++;				// Non elimina l'oggetto dalla collezione malo rimuove solo dall'iteratore
		}
		
		public boolean hasNext{
			return dove < c.length;	// TRUE se ha un elemento successivo, FALSE se non ce l'ha
		}
	
	}	// CHIUSURA DELLA CLASSE INTERNA
	
	public Iterator enumera(){		// Metodo che restituisce il riferimento ad un oggetto che implementa Iterator
		return new MioIteratore();	// Ritorna il riferimento ad un oggetto di tipo MioIteratore appena creato
	}
	
}
La collezione di stringhe viene banalmente rappresentata tramite un array di stringhe (il costruttore non l'ho scritto perchè tanto ai fini di questo argomento mi interessa poco ora come ora)

Poi voglio munirla di un iteratore per poterla scorrere comodamente in modo standard, allora ci ficco dentro una classe interna che ho chiamato MioIteratore che implementa l'interface Iterator e quindi implementa in modo coerente a com'è rappresentata la collezione tutti i metodi presenti dentro Iterator.

Fin quì tutto ok...

La domanda è la seguente....perchè poi fuori alla classe interna (quindi dentro la classe esterna) la proff ha dichiarato il metodo enumera che di fatto restituisce il riferimento ad un MioIteratore? Per comodità?

Ad esempio nel main se volevo iterare non funzionava comunque se creavo un nuovo oggetto di tipo MioIteratore a mano? Oppure non lo vedrei perchè è nella classe interna e quindi devo usare per forza il metodo enumera che è nella classe esterna che a sua volta può comunicare con la classe interna?

Spero di essere stato abbastanza chiaro...

Grazie
Andrea
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2009, 22:21   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2781
MioIteratore è una classe interna privata, quindi dall'esterno non sarebbe possibile instanziarla e neanche richiamarne i suoi metodi. Grazie al metodo enumera e allo sfruttamento dell'override è invece possibile: notare che enumera torna un riferimento a Iterator, quindi dall'esterno farai una cosa del tipo:
Codice:
CollStr c;
...
Iterator it=c.enumera();
while(it.hasNext()){
  String s=it.next();
  ...
}
Quindi dall'esterno ti sembrerà di usare un Iterator generico ma in realtà starai usando i metodi di MioIteratore.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 12-05-2009, 22:36   #3
mostec
Member
 
Iscritto dal: Jan 2001
Città: Rimini
Messaggi: 197
credo che il nome più corretto per il metodo enumera() fosse getIterator().
questo metodo serve per rendere disponibile l'iteratore all'esterno della classe.

come vedi la classe MioIteratore è dichiarata private all'interno della classe della classe CollStr. Al di fuori di essa quindi non è visibile, di conseguenza non sarebbe istanziabile.
Questo non è l'unico problema. Anche se la classe MioIteratore fosse stata public sarebbe comunque concettualmente sbagliato istanziarla al di fuori della collezione.
Se noti bene MioIteratore in diversi metodi legge informazioni dall'array di stringhe c di CollStr. Se tu riuscissi a instanziare un oggetto MioIteratore al di fuori di un oggetto CollStr otterresti un iteratore senza riferimenti all'array da scorrere. Ovviamente non servirebbe a nulla.


Spero di esser stato chiaro.
Ciao.
__________________
Linux + xBox360 + iPod.
Ognuno al suo posto.
mostec è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2009, 09:29   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Scusa,
ma sei sicuro che il il metodo next() dell'iteratore nel codice di esempio postato sia implementato correttamente?

Perchè cos'ì com'è restituisce l'oggetto all'indice corrente 'dove', ma non incrementa l'indice stesso.

Per incrementare l'indice nel tuo iteratore attualmente si è costretti a chiamare il metodo remove(), che non ritorna niente.

Della serie che, per scandire la collezione riportata nel codice di esempio sarei costretto fare così:
Codice:
CollStr c;
...
Iterator it=c.enumera();
while(it.hasNext())
{
    String s = it.next();
    it.remove();  // neccessario per incrementare l'indice interno dell'iteratore
    // ...
}
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 13-05-2009, 09:53   #5
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Scusa,
ma sei sicuro che il il metodo next() dell'iteratore nel codice di esempio postato sia implementato correttamente?

Perchè cos'ì com'è restituisce l'oggetto all'indice corrente 'dove', ma non incrementa l'indice stesso.

Per incrementare l'indice nel tuo iteratore attualmente si è costretti a chiamare il metodo remove(), che non ritorna niente.

Della serie che, per scandire la collezione riportata nel codice di esempio sarei costretto fare così:
Codice:
CollStr c;
...
Iterator it=c.enumera();
while(it.hasNext())
{
    String s = it.next();
    it.remove();  // neccessario per incrementare l'indice interno dell'iteratore
    // ...
}
Esattamente...sul libro di testo e sugli appunti della professoressa dice che grazie agli iteratori ho un modo standard per operare sulle collezioni e che questo modo standard è sempre il seguente:

Codice:
public class Test{
	public static void main(String[] args){
		
		int k;
		CollStr x = new CollStr(....);		// Crea in qualche modo la collezione di stringhe
		String s;
			
		Iterator it;						// Dichiaro una variabile di tipo Iterator
		it = x.enumera();					// Crea il corretto iteratore per la collezione x
		
		while(it.hasNext()){				// Finchè nella collezione ci sono ancora elementi su cui iterare
			s = (String) it.next();			// Metti in s la stringa corrente
			// USA S IN QUALCHE MODO;
			it.remove();	// Passa al successivo elemento rimuovendo quello corrente dall'iteratore (non dalla collezione)
		}
	}
}
Ciao
Andrea
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone L'IA "seria" di Appian è divers...
Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
A causa di un problema durante il lancio...
Per il responsabile delle Porsche 911 e ...
Ritorno di fiamma tra Apple e Intel: gal...
Horses è stato 'bannato': l'horro...
Truffe finanziarie sui social, scatta il...
Tesla inaugura a Busto Arsizio la postaz...
Barriere autostradali fotovoltaiche: Ana...
Accordo Gruppo FS-Microsoft: l'IA dell'a...
Prezzo mai visto: le Sony WH-1000XM5 Spe...
Microsoft amplierà il suo laborat...
ECOVACS DEEBOT T30C OMNI GEN2 a 349€: co...
Super offerta Amazon: HP OMEN MAX 16 con...
L'offerta nascosta di Very Mobile fa gol...
LEAP 71: completata l'accensione di un p...
Furto di segreti industriali in TSMC: pe...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:23.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v