|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
[Java] devo creare un multiset...
Ciao
![]() Sto convertendo un generatore di istanze pseudocasuali da c++ a java (per i noti problemi di ripetibilità del primo linguaggio) ho quasi finito ma mi manca un ultimo step... In c++ avevo usato un multiset per inserire quando mi serviva in una lista una serie di oggetti di tipo Event da me creato. Avevo ridefinito l'operatore < su questi oggetti in modo che confrontasse il campo Event.time. Nella pratica questa bella costruzione mi permetteva di inserire in lista gli eventi man mano che li generavo e di avere alla fine una lista cronologicamente ordinata... Si può fare qualcosa del genere in java?? ho definito sulla classe Event il metodo isBefore() per l'ordinamento ma ora non saprei bene come fare... ho visto sulla doc del sito java che la classe multiset esiste ma non si capisce come costruirne un oggetto nè come specificare il metodo di ordinamento... (non ditemi che devo fare un vettore e poi ordinarlo...)
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB Ultima modifica di leox@mitoalfaromeo : 29-10-2006 alle 12:35. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Credo che tu possa usare un TreeSet. La cosa più simile a quanto hai fatto in C++ è dichiarare il tuo Event concretizzazione di Comparable<Event>. A questo punto dovrai dotare Event di un metodo:
Codice:
public int compareTo(Event that) { restituisce zero se this vale quanto that un numero minore di zero se this è minore di that un numero maggiore di zero se this è maggiore di that } Codice:
TreeSet<Event> eventSet = new TreeSet<Event>(); Il tutto a meno che io non abbia capito una mazza, nel qual caso scomparirò con una pernacchia e una piroetta ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
nella documentazione ufficiale di java leggiti le info relative all'interfaccia Comparable che deve essere implementata dalla tua classe per poter definire un ordinamento naturale tra le istanze di tale classe. In tal modo potrai usare l'operatore > o < perchè il compilatore userà automaticamente il metodo compareTo (come detto da PGI-bis) da te creato perchè richiesto dall'interfaccia comparable
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
A meno che non abbiano introdotto una nuova regola per il linguaggio, se PGI-BIS avesse veramente detto "potrai usare l'operatore > o < perchè il compilatore userà automaticamente il metodo compareTo" allora PGI-Bis dovrebbe fare harakiri. Con la tastiera, perchè così fa più male.
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
si scusate, ho detto una vaccata
cmq a scanso di equivoci citavo PGI-bis in merito al metodo compareTo, e basta |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
perdonatemi se dico vaccate, in fondo sono un povero ingegnere gestionale..
il primo step che dovevo fare, se ho capito bene, era quello di dichiarare la classe Event come un'estensione di Comparable... giusto? quindi ho dichiarato: Codice:
public class Event implements Comparable Codice:
jgenerator.Event is not abstract and does not override abstract method compareTo(java.lang.Object) in java.lang.Comparable ![]() ![]() ![]() ![]()
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
credo ti stia dicendo che hai dichiarato che la tua classe avrebbe implementatao l'interfaccia comparable, ma per implementare tale interfaccia devi definire il metodo compareTo
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
purtroppo anche definendo il metodo compareTo non cambia nulla...
EDIT: invece no!!! bisognava dichiararlo così: Codice:
public class Event implements Comparable<Event>
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB Ultima modifica di leox@mitoalfaromeo : 29-10-2006 alle 15:29. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
ma poi l'implementazione di compareTo come si fa?!?!
ho provato così: Codice:
public int compareTo(Event e) { return this.time_when.compareTo(e.time_when); }
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
come avrai capito il metodo richiesto da un'interfaccia ha un descrittore dello scope del metodo, un tipo di dato da ritornare e una lista di argomenti che DEVONO essere rispettati e che sono definiti nell'interfaccia che implementi
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
allora, in soldoni il metodo compareTo deve ritornare un intero >0 se this è concettualmente maggiore dell'argomento del metodo, <0 se this è concettualmente minore di bla bla e =0 se le due entità sono concettualmenti uguali. in particolare compareTo deve tornare 0 se e solo se il metodo equals() dell'interfaccia comparable torna true. trovi questi dettami nella doc ufficiale dell'interfaccia comparable. se il membro time_when ammette un metodo compareTo coretto, direi che quello che hai scritto va benissimo |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
Quote:
ora cmq ho un altro maledettissimo problema... devo stampare gli eventi nel TreeSet ma non capisco come fare... perchè il maledetto non ha un metodo che restituisce l'elemento i-esimo, ma semplicemente first() o last()...
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
http://java.sun.com/j2se/1.5.0/docs/...l/TreeSet.html
guarda il metodo iterator() per jdk 1.4.2 : http://java.sun.com/j2se/1.4.2/docs/...l/TreeSet.html stesso metodo Ultima modifica di mad_hhatter : 29-10-2006 alle 16:13. |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
Quote:
ho provvisoriamente risolto in questo modo: Codice:
Event[] outBuf= new Event[eventSet.size()]; eventSet.toArray(outBuf); for(int i=0; i<outBuf.length; i++){ System.out.println(outBuf[i].toString());} ![]() in particolare ho potuto verificare che l'ordinamento viene fatto correttamente in base al tempo!! GRAZIE 1000 A TUTTI.. siete stati preziosissimi, vi citerò nei ringraziamenti della tesi ![]() ![]()
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB Ultima modifica di leox@mitoalfaromeo : 29-10-2006 alle 16:59. |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
in bocca al lupo
![]() |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Dovrebbe funzionare anche così, non serve convertirlo in array:
Codice:
for( Event e : eventSet ) System.out.println( e );
__________________
|Java Base| |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
Quote:
Codice:
for( Event e : eventSet ) System.out.println( e.toString() ); ![]()
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
quando fai print(e) il compilatore chiama automaticamente il corrispondente metodo toString()... stavolta sono sicuro (quasi
![]() |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
allora miei cari... oggi sono stato a fare 2 chiacchiere col prof e tra le altre cose ho risolto il problema dell'accesso agli elementi del treeSet...
la chiave era effettivamente il metodo iterator(). In particolare bisogna creare un oggetto di tipo Iterator che poi supporterà i metodi Next() che restituisce l'elemento successivo e HasNext() che è un booleano per trovare la fine del vettore.. è una cosa nuova di java 1.5. quindi il mio ciclo di stampa sul treeSet è venuto così: Codice:
for(Iterator i=j.eventSet.iterator(); i.hasNext(); ) System.out.println(i.next());
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB |
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
![]() Quello che c'è in Java5 è Iterable che è uno dei mezzi che ti consente di usare il ciclo foreach proposto da Lovaz e che, a questo punto, suppongo che tu debba usare. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:49.