PDA

View Full Version : [Java] iteratore e oggetti, problema


D3stroyer
30-11-2007, 17:30
Mi sto confondendo le idee e non trovo niente nemmeno googlando o rileggendo il libro di eckel (probabilmente ho capito male dei passi).

Io sono in questa situazione:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import com.bruceeckel.swing.*;
import com.bruceeckel.util.*;

class pezzo {
pezzo(int a) { numero = a; }
int numero;
}

class numerone {
static int numerostatic;
static void funzione() { numerostatic +=1; }
}

class iteratore {
public static void main(String[] args) {

final ArrayList lista = new ArrayList();
lista.add(new pezzo(numerone.numerostatic));
numerone.funzione();
lista.add(new pezzo(numerone.numerostatic));
numerone.funzione();
lista.add(new pezzo(numerone.numerostatic));
numerone.funzione();
lista.add(new pezzo(numerone.numerostatic));

class TextArea extends JApplet {

String temp;
boolean flag = true;
int Input;
private JTextArea t = new JTextArea(20, 40);

public TextArea() {

Iterator it = lista.iterator();
while(it.hasNext() && flag == true) {
if((((pezzo)it.next()).numero) == 2) {
t.append("Elemento 2 trovato\n");
flag = false;
}
} // da qui sono uscito dal while e l'iteratore è sull'oggetto con numero = 2
Input = (((pezzo)it.next()).numero); //il problema è qui, io non voglio it.next() ma accedere direttamente all'oggetto
temp = Integer.toString(Input);
t.append(temp); //qui temp è uguale a 3, io voglio che sia uguale a 2, cioè che lo prenda dall'oggetto 2 e non dal 3!

Container cp = getContentPane();
cp.setLayout(new FlowLayout());
cp.add(new JScrollPane(t));
}
}
Console.run(new TextArea(), 475, 425);
}
}

Il punto è questo: come posso accedere completamente ad un oggetto dopo aver fatto un ciclo per trovarlo? In questo caso trova l'elemento con numero = 2, ma poi non so come accedervi per eventualmente modificare tutti i dati dell'oggetto (lasciamo stare funzioni, voglio solo poter entrare nell'oggetto come facevo con c++ se possibile) dato che posso solo chiamare next() per spostare l'iteratore. In sostanza mi chiedevo come ovviare alla mancanza di un "it.current()". Sicuramente è facile per voi, illuminatemi :(

alecava
30-11-2007, 18:13
se dichiari una variabile fuori dal ciclo di tipo pezzo con nome tmp e poi la usi nel ciclo così...

while(it.hasNext() && flag == true) {
tmp = (pezzo)it.next;
if(tmp.numero == 2) {
t.append("Elemento 2 trovato\n");
flag = false;
}
}

...quando il ciclo trova quello che vuoi nella variabile tmp hai il riferimento all'oggetto che cercavi e ci fai tutto quello che vuoi....

PS se dichiari ArrayList usando il meccanismo dei generics, cioè ArrayList<pezzo> , puoi evitare i cast che rendono il codice meno elegante

D3stroyer
30-11-2007, 18:18
!

ora si, tutto ha mooolto senso. Grazie.
non sapevo di poter fare tmp = (pezzo)it.next;

D3stroyer
01-12-2007, 09:22
Nel modo che mi hai suggerito mi dice che non sa cosa sia "numero" in questa riga:

if(tmp.numero == 2)

come posso aggiustare?
Ho definito un Object tmp e ho fatto

tmp = (pezzo)it.next();

ma poi cade nell'if.

Don[ITA]
01-12-2007, 11:31
dichiara tmp come pezzo e non come Object ;)

D3stroyer
01-12-2007, 12:06
ok, non è molto pratico, forse c'è un modo piu' intelligente. Per ora grazie a voi ho risolto così.

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import com.bruceeckel.swing.*;
import com.bruceeckel.util.*;

class pezzo {
pezzo() {}
pezzo(int a) { numero = a; }
int numero;
}

class numerone {
static int numerostatic;
static void funzione() { numerostatic +=1; }
}

class iteratore {
public static void main(String[] args) {

final ArrayList lista = new ArrayList();
lista.add(new pezzo(numerone.numerostatic));
numerone.funzione();
lista.add(new pezzo(numerone.numerostatic));
numerone.funzione();
lista.add(new pezzo(numerone.numerostatic));
numerone.funzione();
lista.add(new pezzo(numerone.numerostatic));

class TextArea extends JApplet {

String temp;
boolean flag = true;
int Input;
private JTextArea t = new JTextArea(20, 40);

pezzo tmp = new pezzo();

public TextArea() {

Iterator it = lista.iterator();


while(it.hasNext() && flag == true) {
tmp = (pezzo)it.next();
if(tmp.numero == 2) {
t.append("Elemento 2 trovato\n");
flag = false;
}
}
Input = tmp.numero;
temp = Integer.toString(Input);
t.append(temp);

Container cp = getContentPane();
cp.setLayout(new FlowLayout());
cp.add(new JScrollPane(t));
}
}
Console.run(new TextArea(), 475, 425);
}
}

alecava
01-12-2007, 17:55
comunque non c'è bisogno di scrivere "pezzo tmp = new pezzo();" basta "pezzo tmp;" tanto dopo definisci tmp nel ciclo...Prima ti dava quell'errore perchè se dichiari un riferimento di tipo Object è ovvio che non avrà i metodi che hai definito tu anche se poi effettivamente quel riferimento punta a un oggetto di tipo pezzo, ma questo al compilatore non interessa, se vede il tipo Object ti fa usare solo i metodi di Object

lovaz
01-12-2007, 18:18
Un consiglio: usa nuovo for e generici, visto che stai imparando un
linguaggio è bene non partire da vecchie versioni