PDA

View Full Version : [java]--Linkelist + collections


estrosos
16-10-2007, 07:47
ciao ragazzi..alla fine il problema dell'installazione dell'altro topic sono riscito a farlo..ora vi pongo un'altra domanda...
dovrei fare una rubrica in cui fare una classe contatto...con 1 costruttore che ogni volta a mia rikiesta mi crea un oggetto contatto nuovo..bene..fin qui.. a parte la novità del linguaggio nn c son problemi..
la mia domadna ora è questa..mi si kiede di utilizzare una LinkedList e una collection...volevo sapere qualke informazione fondamentale su queste due cose...se c sono analogie con la lista del c....e magari se potete fare quelke esempio..stupido..anke solo in pseudocodice....cosìkkè possa capire in fretta....grazie tante.ciao

andbin
16-10-2007, 08:20
mi si kiede di utilizzare una LinkedList e una collection...volevo sapere qualke informazione fondamentale su queste due cose...Il termine "collection" (c minuscola) in genere indica, parlando in modo molto generale, una "collezione", un insieme di elementi e basta.
LinkedList è una collection. Ed è una implementazione concreta principalmente delle interfacce List e Queue (da Java5).
Detto questo cosa non ti è chiaro?

estrosos
16-10-2007, 09:56
devo fare un programma che implementi una rubrica.....usando la classe Contatto e l'oggetto contatto..fatto tramite il costruttore....ecco poi dovrei fare una LinkedList di tutti i contatti usando anke collection...siccome sono nuovo del linguaggio nn saprei bene cm fare.....ecco il mio problema...qualek aiutino...magari con qualke riga di codice?...grazie

andbin
16-10-2007, 10:26
ecco poi dovrei fare una LinkedList di tutti i contatti usando anke collectionRipeto ma solo per essere precisi. Parli di "collection" o "Collection" (C maiuscola)? Non è proprio la stessa cosa. "collection" come ho detto è solo un termine generale, come dire "animale" invece di gatto). "Collection" (C maiuscola) è una interfaccia nel package java.util ed la interfaccia che fa da "base" a tutti i Set, List e Queue. Senza contare che c'è pure una classe "Collections" (C maiuscola, s finale) che è una classe con metodi statici di utilità per le collezioni).
Quindi cosa intendi per "anche una collection"???

siccome sono nuovo del linguaggio nn saprei bene cm fareDomanda, giusto per sapere: ti è stato imposto di usare proprio LinkedList?? Normalmente quando si sceglie una collezione non è che si prende la prima a caso .... ogni collezione ha le sue caratteristiche, vantaggi e svantaggi. Quindi dipende da cosa ci devi poi fare con questo "insieme" di contatti.

Comunque, per scrivere qualche riga di codice, ammesso che tu abbia una classe Contatto correttamente implementata, puoi fare:

LinkedList<Contatto> contatti = new LinkedList<Contatto> ();

Contatto c = new Contatto (.......);

contatti.add (c);
.....

estrosos
17-10-2007, 09:28
grazie...in pratica devo usare una Collections....che mi serve per ordinare i contatti contenuti nella LinkedList dei contatti....
mi è stato suggerito di usare compareTo...
io vi posto il codice che ho fatto io...
cioè..la classe Contatto e la classe Rubrica...poi mi son fermato perkè nn sapevo andare avanti...
public class Contatto{
private String nome=null,cognome=null,cf=null;//usare minuscoli

public Contatto(String nome,String cognome,String cf){
this.nome=nome;
this.cognome=cognome;
this.cf=cf;
}

public void setNome(String nome)
{
this.nome=nome;
return;
}


public String toString()
{
return("("+this.cognome+", "+this.nome+", "+this.cf+")");
}


}

e questa è la classe rubrica..
import java.util.*;


public class Rubrica{

public static void main(String[] args) {
LinkedList<Contatto> v = new LinkedList<Contatto>();

v.add(new Contatto("Staller","Ilona","69"));
v.add(new Contatto("Garibaldi","Giuseppe","1000"));
Collections.sort(v);
System.out.println(v);





}
}
vi dico fatto girare così nn gira perkè inserendo quel collection così..mi va in errore..
poi dovrò modificare l'inserto dei nomi da tastiera..con le nextLIne..

andbin
17-10-2007, 10:02
vi dico fatto girare così nn gira perkè inserendo quel collection così..mi va in errore..Perché c'è da sistemare la questione della comparazione. Nella tua classe Contatto devi implementare l'interfaccia Comparable e quindi implementare il metodo compareTo (vedi documentazione).
Questo perché devi stabilire come 2 oggetti di tipo Contatto devono essere comparati tra di loro.

estrosos
17-10-2007, 10:09
inizio a capirci qualcosa finalmente.....potresti darmi il link dove trovo la documentazione?..così almeno imparo anke questa cosa e posso fare la mia rubrica....grazie

andbin
17-10-2007, 10:34
inizio a capirci qualcosa finalmente.....potresti darmi il link dove trovo la documentazione?..così almeno imparo anke questa cosa e posso fare la mia rubrica....grazieLa documentazione sarebbe meglio averla in locale sul PC e consultarla sempre in queste situazioni.

Se vuoi vedere la documentazione online, vedi <qui> (http://java.sun.com/javase/6/docs/). Se vuoi scaricarla (altamente consigliato), vai <qui> (http://java.sun.com/javase/downloads/) e scarica il pacchetto zip della documentazione.

estrosos
17-10-2007, 10:58
grazie..cmq ora t posto cm ho sviluppato il programma con le annotazioni..così magari mi dici dove sbaglio..perkè nn riesco a capire bene gli errori..
questa è la class rubrica
import java.util.*;


public class Rubrica implements Comparable{

public static void main(String[] args) {
LinkedList<Contatto> v = new LinkedList<Contatto>();


v.add(new Contatto("D'Agostino","Gigi","65363"));
v.add(new Contatto("Garibaldi","Giuseppe","1000"));
v.add(new Contatto("Manzoni","Alessandro","2952"));
v.add(new Contatto("Del Piero","Alessandro","1000"));
v.add(new Contatto("Garibaldi","Giuseppe","1000"));
System.out.println(v);
}

public int compareTo(Contatto) { //voglio fare il compareTo per far confrontare
//due elementi contatto della LinkedList successivi
//ed eventualmente scambiarli
//ordinandoli per cognome per esempio
int i=0;
int j=0;
for(i=0;i<10;i++){
for(j=1;j<11;j++){
if(Contatto.get(j)>Contatto.get(i)){
String scambia1=Contatto.get(j);
String scambia2=Contatto.get(i);
String temp;
scambia1=temp;
scambia1=scambia2;
scambia2=temp;
v.add("i",scambia2);
v.add("j",scambia1);
}
}
}


}
}
}

questa è la class contatto
public class Contatto{
private String nome=null,cognome=null,cf=null;//usare minuscoli

public Contatto(String nome,String cognome,String cf){
this.nome=nome;
this.cognome=cognome;
this.cf=cf;
}

public void setNome(String nome)
{
this.nome=nome;
return;
}


public String toString()
{
return("("+this.cognome+", "+this.nome+", "+this.cf+")");
}


}

andbin
17-10-2007, 11:17
grazie..cmq ora t posto cm ho sviluppato il programma con le annotazioni..così magari mi dici dove sbaglio..perkè nn riesco a capire bene gli errori..La interfaccia Comparable la devi implementare in Contatto, non in Rubrica (la collezione da ordinare è di contatti).

Inoltre il compareTo è totalmente fuori senso.

In <questa> (http://www.hwupgrade.it/forum/showthread.php?t=1451075) discussione e in <questa> (http://www.hwupgrade.it/forum/showthread.php?t=1503774)avevo fatto un esempio (basilare) di implementazione di Comparable.

Don[ITA]
17-10-2007, 11:24
Innanzi tutto l'interfaccia Comparable devi implementarla in contatto, visto che sono proprio i contatti che devono essere comparati tra di loro per essere ordinati. Poi, il metodo compareTo ritorna 0 se i due oggetti comparati sono uguali, ritorna 1 se l'oggetto comparato è maggiore e -1 se è minore, ovvero se l'oggetto corrente è maggiore...Tra tutti questi maggiori e minori sicuramente avrai capito poco nulla per cui ti posto il compareTo che ho usato per mettere in ordine alfabetico gli elementi di una tabella (ovviamente composti da più Stringhe):

public int compareTo(Object currentItem){
if (!(currentItem instanceof listItem))
throw new ClassCastException("Oggetto sbagliato. Non comparabile.");

String compare = ((listItem)currentItem).getName();
String[] sorted = {this.getName(),compare};
Arrays.sort(sorted);
if(sorted[0].equals(this.getName()))
return -1;
else if(sorted[0].equals(compare))
return 1;
else
return 0;
}

In questo caso non avevo usato una LikedList per contenere i miei oggetti ma avevo usato un Vector. Una volta aggiunti gli elementi ho richiamato il metodo Collections.sort(Vector che ho usato) che basandosi proprio sul compareTo mi ha ordinato gli elementi del mio vettore.

Spero che tu abbia capito :D

Ciauz

andbin
17-10-2007, 11:53
;19189339']Spero che tu abbia capito :D Oddio ... con l'esempio che hai fatto, dubito. :fagiano:

Innanzitutto sarebbe meglio usare i generics, se possibile. Se non li si usa, va anche bene fare il test e il lancio di ClassCastException ma in genere è sufficiente un cast (tanto lancerebbe lo stesso ClassCastException se l'oggetto non è appropriato). Inoltre se i campi da comparare sono di tipo String, è sufficiente usare il compareTo sulle stringhe.

Morale della favola, volendo usare i generics e volendo fare la comparazione su cognome/nome e ammesso che ci siano dei metodi getNome/getCognome, basta fare:

public class Contatto implements Comparable<Contatto>
{
....

public int compareTo (Contatto altro)
{
int r = getCognome().compareTo (altro.getCognome());
if (r == 0)
r = getNome().compareTo (altro.getNome());
return r;
}
}

estrosos
17-10-2007, 14:20
nn ho ancora risolto perfettamente il prog ma ora c sto capendo molto d +...
grazie:)