Pages: 1 2 [3]   Go Down
Print
Author Topic: Esercizio sugli array espandibili.  (Read 6067 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #30 on: 02-06-2010, 18:13:09 »

Scusa ma ci sono altri problemi prima ancora del metodo add, non mi compilano le classi.

Code:
public interface OrderedSet <E extends Comparable> {
// ritorna true se l'insieme è vuoto
public boolean isEmpty();
// ritorna il numero di elementi contenuti nell'insieme
public int size();
// inserisce un nuovo elemento nell'insieme
public void add(E element);
// elimina il primo elemento di valore element
public void remove(E element);
// ritorna true se l'emento element è presente nell'insieme
public boolean isPresent(E element);
// ritorna l'elemento più piccolo dell'insieme
public E getFirst();
// ritorna l'elemento più grande dell'insieme
public E getLast();
// stampa la lista ordinata degli elementi dell'insieme
public String toString();
}

Code:
public interface Person extends Comparable{

public void setNome(String nome);
// setta il nome della persona
public void setCognome(String cognome);
// setta il cognome della persona
public void setAnni(int anni);
// setta l'età della persona
public String getNome();
// ritorna il nome della perona
public String getCognome();
// ritorna il cognome della persona
public int getAnni();
// ritorna l'età della persona
public int compareTo(Person person);
/* ritorna un valore maggiore di 0 se la persona ha un valore
più grande di person; 0 se hanno due valori uguali; un intero
minore di 0 altrimenti*/
}

Code:
public class ListOfArray <E extends Comparable> implements OrderedSet<E>


già qui: solo scrivendo l'intestazione e senza nulla nella classe.
Se non erro dava problemi anche se c'era tutto il corpo.

Code:
ListOfArray.java:1: ListOfArray is not abstract and does not override abstract method getLast() in OrderedSet
public class ListOfArray <E extends Comparable> implements OrderedSet<E>
       ^

E poi in

Code:
public class ListPerson implements Person
{
private String nome;
private String cognome;
private int anni;

public ListPerson(String nome, String cognome, int anni)
{
this.nome=nome;
this.cognome=cognome;
this.anni=anni;
}

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

public void setCognome(String cognome) {this.cognome=cognome;}

public void setAnni(int anni){this.anni=anni;}

public String getNome(){ return nome;}

public String getCognome(){ return cognome;}

public int getAnni(){return anni;}

public int compareTo(Person person) throws ClassCastException
{
int ret = cognome.compareTo(person.getCognome());
if (ret != 0) return ret;

ret = nome.compareTo(person.getNome());
if (ret != 0) return ret;

return anni - person.getAnni();
}

}
Ho:

Code:
istPerson.java:1: ListPerson is not abstract and does not override abstract method compareTo(java.lang.Object) in java.lang.Comparable
public class ListPerson implements Person
       ^
1 error

Nom capisco che cosa manca...
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
XDnl
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 376



« Reply #31 on: 03-06-2010, 09:45:55 »

E' una pena questo esercizio eh?  pc testate  
Quando estendi un'interfaccia, la classe in questione deve implementare tutti i suoi metodi.
Gli errori di compilazione sono dovuti a due motivi:

  • Metodi presenti nell'interfaccia, ma non implementati nella classe
Code:
ListOfArray.java:1: ListOfArray is not abstract and does not override abstract method getLast() in OrderedSet
public class ListOfArray <E extends Comparable> implements OrderedSet<E>
In questo caso OrderedSet<E> prevede un metodo getLast(), che evidentemente non hai implementato in ListOfArray<E extends Comparable>.

  • Firma del metodo non corrispondente alle specifiche dell'interfaccia

Devi fare molta attenzione quando implementi la classe, infatti basta anche una minima differenza con l'interfaccia per far "confondere" ( I) il compilatore.
Con questo metodo:
Code:
public class ListPerson implements Person
{
// ... omissis.... (commento perchè sennò dà errore   :-K)
public int compareTo(Person person) throws ClassCastException
{
int ret = cognome.compareTo(person.getCognome());
if (ret != 0) return ret;

ret = nome.compareTo(person.getNome());
if (ret != 0) return ret;

return anni - person.getAnni();
}
}
ottieni il seguente errore
Code:
ListPerson.java:1: ListPerson is not abstract and does not override abstract method compareTo(java.lang.Object) in java.lang.Comparable
public class ListPerson implements Person
1 error
perchè in realtà la firma del metodo compareTo prevede un parametro di tipo java.lang.Object, NON Person.
In particolare il compilatore considera differenti i due metodi e quindi è come se non stessi implementando il metodo compareTo dell'interfaccia, da cui l'errore.  

Quando estendi interfacce non tue, conviene sempre fare riferimento alla documentazione:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html#method_summary

 

Edit: Il nome "ListPerson" è un po' fuorviante perchè fa pensare ad una lista di persone, mentre in realtà è solo una.  Il compilatore non si confonderà per questo, ma una persona magari sì.
« Last Edit: 03-06-2010, 10:35:18 by XDnl » Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #32 on: 03-06-2010, 22:37:39 »

 

Azz......adesso funziona, una parte...domani faccio il resto sperando funzioni tutto e ti faccio sapere.... ma non credere che te la caverai così facilmente 

P.S, onde evitare di aprire un nuovo topic, mi chiedevo un altra cosa,noi gli alberi e gli alberi binari di ricerca li
abbiamo implementati in che modo?

Array o liste?
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #33 on: 05-06-2010, 09:12:35 »

Ho visto che già siete andati avanti... cmq io x si e x no vi posto il mio codice di compareTo anche se nn utilizzo la classe compare

Code:
public int compareTo(Person person){
if(this.getCognome().compareTo(person.getCognome())>0){
return 1;
}

if(this.getCognome().compareTo(person.getCognome())== 0){
if(this.getNome().compareTo(person.getNome())>0) return 1;

if (this.getNome().compareTo(person.getNome())== 0){
if(this.getAnni() > (person.getAnni())) return 1;
else return 0;
}
}
return -1;
}

in poche parole controlla prima il cognome e se sono uguali i due cognomi, va a vedere il nome e così via sino ad arrivare all'ultimo controllo relativo all'età
Logged

Rappresentante studenti Corso di Laurea in Informatica - arianna317@gmail.com

write once, run everywhere..
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #34 on: 05-06-2010, 13:38:33 »

Dovrebbe essere simile al nostro, o meglio quello che XDnl ha pensato 

Io invece non sono riuscito a fare l'inserimento....mi confondo troppo....ci sono un sacco di problemi da gestire..
aryanna, l'hai fatto come hai postato qualche intervento fa? Senza avere problemi con i "tipi"?
Uff.....
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #35 on: 05-06-2010, 15:10:29 »

Sisi l'ho fatto come quello che ho postato, è un esercizio piuttosto tosto in effetti. devi prima avere in mente la struttura proprio di come devono essere qst nodi con gli array ecc ecc... così ti verrà già più semplice pia piano scrivere il codice
Logged

Rappresentante studenti Corso di Laurea in Informatica - arianna317@gmail.com

write once, run everywhere..
XDnl
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 376



« Reply #36 on: 05-06-2010, 15:48:48 »

Dovrebbe essere simile al nostro, o meglio quello che XDnl ha pensato 

Io invece non sono riuscito a fare l'inserimento....mi confondo troppo....ci sono un sacco di problemi da gestire..
aryanna, l'hai fatto come hai postato qualche intervento fa? Senza avere problemi con i "tipi"?
Uff.....
Forza Daréios non ti arrendere!  ok
Dopo tutti questi post DEVI farlo funzionare 

@aryanna: ma alla fine a te funziona il programma?
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #37 on: 05-06-2010, 20:10:43 »

Ho provato a scrivere qualcosa, che ancora non ho provato perchè devo correggere altri errori dovuti ai tipi.
Maledettissimi tipi.. cry
Però volevo sapere...insomma quanto di sbagliato c'è in quello che ho scritto nell'algoritmo add, poichè ho un modo di pensare molto contorto....

Intanto due metodi che ho creato....sperando che mi possano servire.

Code:
public boolean ArrayFull(int [] a)         //verifica se l'array è pieno
{
return (a[a.length-1]!=null);

}

public int getArrayIndex(int []a)      //restituisce l'indice dell'ultimo elemento
{
int index=0;
for(int i=0; i<a.length; i++)
{
if(a[i]!=null)
index++;
}
return index;
}



E poi la parte contorta...

Code:
public void add(E element)
{
if(size==0)
{
Persona[] vett=new Persona[CAPACITY];
vett[0]=(Persona)element;                                //Se la lista è vuota creo un nodo e inserisco nella prima posizione dell'array element
Node<E> node=new Node(vett);
head=node;

}

else if(size>0)
{
boolean inserito=false;

Node<E> node=head;

Persona []vett=(Persona[])node.getElement();


for(Node <E> node2=node; node!=null; node=node.getNext())
{
       int index=vett.getArrayIndex(this);

if(index!=vett.length-1)                       //Se l'array ha posti disponibili
{
for(int i=0; i<=index; i++)
{
if(vett[i].compareTo(element)<0)
{
for(int j=index+1; j>=i; j--)        //shifto gli elementi a destra
{
vett[j]=vett[j-1];               //inserisco nella posizione libera element
}

vett[i]=element;
inserito=true;
}

}

if(inserito==false)                          //Se nei confronti di prima element non è minore di nessuno lo inserisco alla fine di tutti perchè è più grande
{
vett[index+1]=element;
}
}

else                              //Se l'array è pieno
{
inserito=false;
Persona[] vett2=new Persona[CAPACITY];

for(int i=0; i<=index; i++)
{
if(vett[i].compareTo(element)<0)
{
vett2[0]=vett[index];                     //allora copio l'ultimo elemento in un nuovo array e shifto come prima gli altri valori
for(int j=index; j>=i; j--)         
{
vett[j]=vett[j-1];
}

vett[i]=element;
inserito=true;
}
}

if(inserito==false)
{
vett2[0]=element;                  //se element è maggiore di tutti allora dato che l'array è pieno lo metto in un nuovo array in posizione 0
inserito=false;
}
}

node2=node.getNext();          //continuo a scorre sulla lista per fare confronti...

}
}

size++;
}
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #38 on: 06-06-2010, 09:42:12 »

Si si, alla fine a me funziona. Ho visto il tuo add...in poche parole inserisci e nel frattempo ordini, x quello che capisco mi sembra giusto o meglio non mi è chiara una cosa... quando vedi che l'array è pieno ne crei un altro e ..? nn lo passi ad un nodo come fai nel caso iniziale qnd crei il primo array e fai
Code:
Node<E> node=new Node(vett);
comunque, aspettiamo lo stesso il parere di XDnl k è meglio!  boh
Logged

Rappresentante studenti Corso di Laurea in Informatica - arianna317@gmail.com

write once, run everywhere..
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #39 on: 06-06-2010, 11:00:15 »

Azz.....si si certo, su tutto quel codice me ne ero dimenticato...dunque.....dovrei assegnare a un nuovo nodo e impostarlo come tail, sperando sia giusto:

Code:
else                              //Se l'array è pieno
{
inserito=false;
Persona[] vett2=new Persona[CAPACITY];

for(int i=0; i<=index; i++)
{
if(vett[i].compareTo(element)<0)
{
vett2[0]=vett[index];                     //allora copio l'ultimo elemento in un nuovo array e shifto come prima gli altri valori
for(int j=index; j>=i; j--)          
{
vett[j]=vett[j-1];
}

vett[i]=element;
inserito=true;
}
}

if(inserito==false)
{
vett2[0]=element;                  //se element è maggiore di tutti allora dato che l'array è pieno lo metto in un nuovo array in posizione 0
inserito=false;
}
}

Node<E> nuovo=new Node(vett2);
tail.setNext(nuovo);
tail=nuovo;
node2=node.getNext();          //continuo a scorre sulla lista per fare confronti...

}
}



 boh

Nel frattempo cerco di risolvere gli altri problemi con i tipi....

Il problema è che ho fatto la classica classe Node:

Code:
public class Node<E>
{
private E element;
private Node<E> next;

public Node(E element)
{
this.element=element;
this.next=null;
}

public void setElement(E element){this.element=element;}

public E getElement(){ return element;}

public void setNext(Node<E> node){this.next=node;}

public Node<E> getNext(){return next;}

}




E mi dà errore nel metodo add stesso, un problema con i tipi:

Code:
public void add(E element)
{
if(size==0)
{
Persona[] vett=new Persona[CAPACITY];
vett[0]=(Persona)element;                                //Se la lista è vuota creo un nodo e inserisco nella prima posizione dell'array element
Node<E> node=new Node(vett);
head=node;

}

else if(size>0)
{
boolean inserito=false;

Node<E> node=head;

Persona []vett=(Persona[])node.getElement();      //errore   



 inconvertible types
found   : E
required: Persona[]
Persona []vett=(Persona[])node.getElement();



Però il cast lo faccio....
« Last Edit: 06-06-2010, 11:13:49 by Daréios » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
XDnl
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 376



« Reply #40 on: 06-06-2010, 17:53:19 »

Leggi i commenti:
Code:
public void add(E element)
{
// Suppongo tu abbia una cosa del genere nella classe ListOfArray<Person>:
// public Node<E> head;
// public int size;
// Pero' se tu crei una ListOfArray<Person> avrai E = Person e quindi
// public Node<Person> head; che è una lista di Person, non una lista di array di person :P
// Vabbè a parte questo...

// Se non ci sono liste allocate....
if (size==0)
{
// Creo un array
Persona[] vett=new Persona[CAPACITY];

// Imposto il primo elemento
// Solito discorso, element potrebbe essere qualunque cosa:
// public class CosaCheNonCentraNiente { ... }
// ListOfArray<CosaCheNonCentraNiente> lista;
// Se element non è di tipo Persona allora verrà lanciata l'eccezione java.lang.ClassCastException
// Vabbè a parte questo...
vett[0]=(Persona)element;

// Creo il nodo (discorso di prima, E sarebbe Person, non Person[])
// Dovresti fare una cosa del tipo Node<E[]> node = new Node(vett);
Node<E> node=new Node(vett);

// Imposto la testa
head = node;
}
else
// Se ci sono liste...
if (size > 0)
{
// Oddio che malo pezzo di codice O_O
// Ok vediamo... XD
boolean inserito=false;

// Memorizzo in vett il primo array di persone
Node<E> node=head;
Persona []vett=(Persona[])node.getElement();

// Per ogni array di person (Person[]) presente nella lista
// Hmmm
// Node <E> node2=node (inizializzi node2)
// node != null (il test lo fai su node)
// node = node.getNext() (modifichi node)
// hmmm... non dovrebbe essere
// for (Node <E> node2=node; node2!=null; node2=node2.getNext()) ?
for (Node <E> node2=node; node!=null; node=node.getNext())
{
// Calcolo l'indice del primo posto vuoto
int index=vett.getArrayIndex(this);

// Se questo indice non è fuori dall'array (ossia se ci sono posti disponibili)
// (hmmm dovrebbe essere if (index != vett.length), infatti vett.length - 1 è un indice valido!)
if (index != vett.length-1)
{
// Per ogni elemento (fino ad index)
for (int i = 0; i <= index; i++)
{
// Se l'elemento i-esimo viene prima di element (cioè la persona da inserire)
if(vett[i].compareTo(element)<0)
{
//shifto gli elementi a destra
// Se i = 0 e j = 0 quando fai vett[j] = vett[j - 1] ti dà IndexOutOfBoundsException
for(int j=index+1; j>=i; j--)       
{
vett[j]=vett[j-1];               
}

// inserisco nella posizione libera element
vett[i]=element;
inserito=true;
}
// Hmmm... continua a ciclare..
}

// Boh mi sono un po' perso in questa parte
if(inserito==false)                         
{
vett[index+1]=element;
}
}
else  // Se l'array è pieno
{
// Creo un nuovo vettore (ma questo lo fai per ogni vettore pieno che incontri??)
inserito=false;
Persona[] vett2=new Persona[CAPACITY];

for(int i=0; i<=index; i++)
{
if(vett[i].compareTo(element)<0)
{
vett2[0]=vett[index];                     //allora copio l'ultimo elemento in un nuovo array e shifto come prima gli altri valori
for(int j=index; j>=i; j--)         
{
vett[j]=vett[j-1];
}
// Copi i valori in vett2
// Ma poi inserisci element in vett[i]?
vett[i]=element;
inserito=true;
}
}

if(inserito==false)
{
// Qua invece inserisci in vett2
vett2[0]=element;                  //se element è maggiore di tutti allora dato che l'array è pieno lo metto in un nuovo array in posizione 0
inserito=false;
}
}

// Crei un nodo con l'array vett2 inserendolo in coda
Node<E> nuovo=new Node(vett2);
tail.setNext(nuovo);
tail=nuovo;

// Sposti node2 (boh, con il ciclo for che hai scritto serve, con quello suggerito da me no)
node2=node.getNext();          //continuo a scorre sulla lista per fare confronti...
}
}

// Incremento size
// Ora: size indica il numero di elementi inseriti oppure il numero di elementi presenti nella lista linkata?
size++;

// Conclusione: BOH. Non ho capito bene la logica del programma, in ogni caso non credo funzioni.
// Il discorso è semplice: hai una lista di array.
// Cioè una lista dove ogni nodo contiene un array(di dimensione fissa, pari a CAPACITY) di elementi di E
// Node<E> non è quello che ti serve, in quanto è una lista di elementi di E
// Ti serve una lista di array di E ossia Node<E[]>
// Devi dividere l'algoritmo di inserimento in due passi:
// 1) Trovare tra TUTTE le liste allocate il posto giusto in cui inserire l'elemento (senza fare allocazioni, nè modifiche)
// 2) Puoi avere due casi:
// L'array in questione non ha abbastanza spazio per il nuovo elemento: questo è il caso piu' difficile, perchè devi shiftare tutti gli eleementi della liste successive
// L'array in questione ha spazio per il nuovo elemento: devi shiftare a destra tutti gli elementi successivi al posto giusto ed inserire l'elemento nel punto.
}
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #41 on: 07-06-2010, 13:30:18 »

Mh........bè ma classe ListOfArray io l'avevo messa E, in effetti nel testo mi pare è specificato sia da mettere come ListOfArray<Person>.

Per il resto più tardi provo, ora penso farò analisi.....del sangue I

Per il resto, dici che secondo te non funziona, pensavo di esserci andato vicino però, di shiftare gli elementi nei nuovi array di un nuovo nodo, oppure seplicemente di aggiungerli nello stesso array....................vabbè.
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Pages: 1 2 [3]   Go Up
Print
Jump to: