Pages: 1 [2] 3   Go Down
Print
Author Topic: Esercizio sugli array espandibili.  (Read 6095 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 #15 on: 30-05-2010, 10:50:33 »

Eh ma per l'ordinamento devo creare un metodo apposta io?
Per getFirst e getLast, non sto capendo...su tutto l'insieme come faccio a stabilire il più piccolo, cioè sarebbe quello che ha cognome che inizia con A, nome per A, e il minor numero di anni?
Viceversa per il più grande?
Mentre per ordinare gli elementi avete creato un vostro metodo in questa classe oppure tramite getFirst e getLast si può ordinare?
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 #16 on: 30-05-2010, 12:48:26 »

Allora ci sn riuscita mettendo insieme le idee di altri ragazzi.. in pratica l'add l'abbiamo implementato in qst modo..
Code:
public void add(E element){
if(tail==null){
ListPerson [] vett = new ListPerson[100];
cont=0;
vett[cont]= (ListPerson) element;
Node n= new Node(vett);
tail=n;
head=tail;
size++;
}
else if(cont==99){
cont=0;
ListPerson [] vett = new ListPerson[100];
vett[cont]=(ListPerson) element;
Node n= new Node(vett);
tail.setNext(n);
tail=n;
size++;
}
else{
ListPerson [] vettsupp= (ListPerson[]) tail.getElement();
cont++;
vettsupp[cont]= (ListPerson) element;
tail.setElement((E) vettsupp);
}
}

  Ho riflettuto un po' sul tuo codice.  
La classe ListPerson è una lista di persone ( ) o contiene le informazioni su una singola persona?
Nel secondo caso (che penso sia il più logico), praticamente mantieni una lista dove ogni nodo è un array di 100 persone.
La variabile cont serve a tener traccia dell'indice dell'ultimo elemento inserito giusto?
C'è una cosa però che non mi convince: il metodo add fa parte della classe ListOfArray<E> dove E è un elemento generico, mentre all'interno del metodo crei un'array di tipo ListPerson.
Se per esempio vorresti creare una ListOfArray<Integer> quando fai
Code:
vettsupp[cont]= (ListPerson) element;
dovresti avere una ClassCastException (o qualcosa del genere  testate)

L'inserimento inoltre avviene in coda e quindi all'interno dei vari array le persone non sono ordinate in senso non decrescente. (e qui approfitto per rispondere a Darèios  [Emoticon] Asd)

Eh ma per l'ordinamento devo creare un metodo apposta io?
In teoria dovrebbe essere il metodo compareTo dell'interfaccia Person  

Per getFirst e getLast, non sto capendo...su tutto l'insieme come faccio a stabilire il più piccolo, cioè sarebbe quello che ha cognome che inizia con A, nome per A, e il minor numero di anni?
Viceversa per il più grande?
Esattamente.

Mentre per ordinare gli elementi avete creato un vostro metodo in questa classe oppure tramite getFirst e getLast si può ordinare?
A quanto ho capito io, quando fai add devi inserire l'elemento al posto giusto. In questo modo ti ritrovi i vari array ordinati.

Secondo me il problema permane: come si fa (assumendo che E sia un tipo generico) a confrontare due elementi?
Il professore ha dato delle indicazioni a riguardo? 
« Last Edit: 30-05-2010, 12:51:44 by XDnl » Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #17 on: 30-05-2010, 12:55:30 »

Tu dici che l'ordinamento va fatto con il metodo add inserendo gli elementi nell'array al posto giusto.
Quindi non può essere che invece con add si inseriscono semplicemente gli elementi che si leggono in input, si riempie tutta la lista, e poi con un metodo appostito si confrontano gli elementi una volta inseriti nelle liste accedendo agli array?

Quote
Secondo me il problema permane: come si fa (assumendo che E sia un tipo generico) a confrontare due elementi?

Non ho provato, ma secondo te dà errori?
Cioè con il fatto che si dichiara tutto con i generics non dovrebbe permettere al compareTo di funzionare lo stesso?
« Last Edit: 30-05-2010, 12:57: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 #18 on: 30-05-2010, 13:01:47 »

Tu dici che l'ordinamento va fatto con il metodo add inserendo gli elementi nell'array al posto giusto.
Quindi non può essere che invece con add si inseriscono semplicemente gli elementi che si leggono in input, si riempie tutta la lista, e poi con un metodo appostito si confrontano gli elementi una volta inseriti nelle liste accedendo agli array?
Beh anche volendo fare così (che secondo me non è molto logico, essendo la classe una OrderedSet, ossia un insieme ordinato), nell'implementare i metodi getFirst e getLast hai comunque bisogno di usare la compareTo della classe Person.

Non ho provato, ma secondo te dà errori?
Cioè con il fatto che si dichiara tutto con i generics non dovrebbe permettere al compareTo di funzionare lo stesso?
Il problema è che i generics, come specificati nel testo, sono un po' troppo... generics...  boh
Il metodo compareTo non fa parte della classe Object, bensì dell''interfaccia comparable (Object ha al massimo il metodo equals, che non è sufficiente).
Quindi un generico oggetto di tipo E non ha il metodo compareTo.
L'unica soluzione che ho trovato è stata di imporre che il tipo generico E estenda l'interfaccia comparable.
Come già detto però, non sono sicuro che modificare il testo sia il modo corretto per affrontare l'esercizio.

Come si fa ad aggirare il problema senza cambiare le interfacce?  testate testate testate

P.S: Avete notato che il testo dell'esercizio "Liste implementate tramite vettori" (sempre nella stessa sezione) è identico a quello precedente? (mentre nella pagina html del sistema la descrizione, purtroppo incompleta, è quella corretta).
« Last Edit: 30-05-2010, 13:12:36 by XDnl » Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #19 on: 30-05-2010, 13:32:11 »

Si ci avevo fatto caso, al fatto che sono uguali, però non che quella incompleta fosse diversa, ad ogni modo l'input e l'output di quella non so se siano corretti a questo punto, sono identici pure quelli.....
Ma se il tuo metodo funziona perchè no, forse lui non ha voluto specificare tutto per fare in modo che gli studenti da soli dovessero capire come aggirare il problema, però a me non compila in quel modo:

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

si scrive così? Nonostante abbia modificato come hai detto tu le altre classi per farsì che il tipo generico estenda Comparable non mi compila così.

[RISOLTO]

Certo che se non apro con la parentesi graffa.....  pray
« Last Edit: 30-05-2010, 13:36:21 by Daréios » Logged

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

Posts: 110



« Reply #20 on: 30-05-2010, 14:18:09 »

Quote
La classe ListPerson è una lista di persone o contiene le informazioni su una singola persona?
Nel secondo caso (che penso sia il più logico), praticamente mantieni una lista dove ogni nodo è un array di 100 persone.
La variabile cont serve a tener traccia dell'indice dell'ultimo elemento inserito giusto?
C'è una cosa però che non mi convince: il metodo add fa parte della classe ListOfArray<E> dove E è un elemento generico, mentre all'interno del metodo crei un'array di tipo ListPerson.
Se per esempio vorresti creare una ListOfArray<Integer> quando fai

vettsupp[cont]= (ListPerson) element;
dovresti avere una ClassCastException (o qualcosa del genere  )

La mia ListPerson in effetti sarebbe stato più opportuno chiamarla Persona perchè in poche parole contiene le informazioni relative ad una singola persona. Cont è l'indice dell'array. Mentre nn capisco cosa intendi per la classe ClassCastException perchè lavorando con oggetti generici non dovrebbero esserci problemi facendo un ListOfArray<Integer> o ListOfArray<ListPerson> (come d'altronde ho fatto)... o a qst punto c'è qualcosa che mi sfugge sul concetto di oggetti generici..però penso abbia senso logico è un array di persone proprio come richiede il testo
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 #21 on: 30-05-2010, 14:24:36 »

Ma quindi con l'add inserisci solamente in lista gli elementi che leggi in input, ma poi per ordinarli e metterli nelle giuste posizioni dell'array(e dei nodi) hai scritto un metodo a parte semrpe in questa classe?
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 #22 on: 30-05-2010, 14:25:04 »

Mentre nn capisco cosa intendi per la classe ClassCastException perchè lavorando con oggetti generici non dovrebbero esserci problemi facendo un ListOfArray<Integer> o ListOfArray<ListPerson> (come d'altronde ho fatto)...
Prova ad eseguire questo programmino:

Code:
// La classe usa il tipo generico E
class Generico<E>
{
// Qui invece diamo per sicuro che E sia un intero
public int dato;

public Generico(E element)
{
// Se element non è effettivamente un intero, viene
// lanciata l'eccezione java.lang.ClassCastException
dato = (Integer)element;
}

}

public class main
{

public static void main(String[] args)
{
// Ok
Generico<Integer> prova = new Generico<Integer>(3);

// Errore!
Generico<String> prova2 = new Generico<String>("CIAO");
}
}

o a qst punto c'è qualcosa che mi sfugge sul concetto di oggetti generici..però penso abbia senso logico è un array di persone proprio come richiede il testo
Si, però la classe ListOfArray è dichiarata così
Code:
class ListOfArray<E> // E potrebbe essere la qualunque cosa
{
 ....
}
Mentre all'interno di add crei direttamente degli array di ListPerson, ma nessuno ti garantisce che il tipo generico E sia effettivamente quello.
Se provi a creare una ListOfArray<Integer>, quando fai il cast di tipo, dovresti avere un'eccezione.

Ma quindi con l'add inserisci solamente in lista gli elementi che leggi in input, ma poi per ordinarli e metterli nelle giuste posizioni dell'array(e dei nodi) hai scritto un metodo a parte semrpe in questa classe?
No, con la modifica delle interfacce, ho fatto che add inserisce gli elementi al posto giusto, quindi alla fine ho tutti gli elementi ordinati. L'elemento piu' piccolo è il primo elemento del primo array, mentre quello piu' grande sarà l'ultimo elemento dell'ultimo array.  pc

 boh A questo punto penso sia meglio fare come si crede, basta che funzioni  ok
« Last Edit: 30-05-2010, 14:35:21 by XDnl » Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #23 on: 30-05-2010, 14:37:31 »

Scusate, potrei sapere come avete implementato il compareTo dell'interfaccia Person?
« Last Edit: 30-05-2010, 14:51:32 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 #24 on: 31-05-2010, 17:08:24 »

Scusate, potrei sapere come avete implementato il compareTo dell'interfaccia Person?
Ecco (un po' in ritardo XD) la mia versione:
Code:
// 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
public int compareTo(Object o) throws ClassCastException
{
Person person = (Person)o;
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();
}

public boolean equals(Object obj) throws ClassCastException
{
return compareTo(obj) == 0;
}
Ovviamente l'interfaccia Person è stata modificata (nel senso che estende Comparable).
 
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #25 on: 31-05-2010, 21:09:46 »

Quando ad esempio fai:

Code:
int ret = cognome.compareTo(person.getCognome());
Confronto il cognome della persona che sta invocando il metodo con quella tra parentesi?
P.S. Io avrei pensato che ci voleva il this.

Code:
int ret=this.cognome.compareTo......

Invece per l'inserimento ordinato, io sto avendo molta confusione(per non dire che non so farlo  )
Perchè in sostanza, dovrei leggere in input un elemento e praticamente il metodo add all'interno della lista vede in testa, nell'array gli elementi, li confronta, e in caso li shifta tutti, quindi se per esempio la dimensione 100 viene raggiunta io dovrei spostare gli elementi nell'altro nodo accanto?  
« Last Edit: 31-05-2010, 21:56:59 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 #26 on: 01-06-2010, 09:46:56 »

Quando ad esempio fai:

Code:
int ret = cognome.compareTo(person.getCognome());
Confronto il cognome della persona che sta invocando il metodo con quella tra parentesi?
Si.  

P.S. Io avrei pensato che ci voleva il this.
No.  

Code:
int ret=this.cognome.compareTo......
Funziona anche in questo modo, comunque non è necessario usare la parola chiave this.

Invece per l'inserimento ordinato, io sto avendo molta confusione(per non dire che non so farlo  )
Perchè in sostanza, dovrei leggere in input un elemento e praticamente il metodo add all'interno della lista vede in testa, nell'array gli elementi, li confronta, e in caso li shifta tutti, quindi se per esempio la dimensione 100 viene raggiunta io dovrei spostare gli elementi nell'altro nodo accanto?  
Si.   All'inizio avevo sbagliato anch'io, ordinando in modo separato gli array.
Supponiamo che la dimensione max. di ciascun array sia 2 ( [Emoticon] Asd) con 4 elementi da inserire:
A, C, D, B

Applicando il seguente algoritmo:
- Trova la prima lista che non è piena, altrimenti creane una nuova
- Inserisci l'elemento al posto giusto

Otteniamo i seguenti passi:
- [A, vuoto] (primo elemento inserito, lista creata)
- [A, C]
- [A, C] - [D, vuoto]
- [A, C] - [B, D]
Come vedi l'ordine degli elementi non è "globale" ma relativo ad ogni singolo array.
Per questo è necessario agire come hai detto tu (cioè cercare il posto giusto in TUTTI gli array, sia pieni che non, e agire di conseguenza).
Con il nuovo algoritmo avremmo i seguenti passi:
- [A, vuoto]
- [A, C]
- [A, C] - [D, vuoto]
- [A, B] - [C, D]
Come vedi adesso la configurazione è corretta. Ovviamente questa versione è più complessa, sono riuscito ad implementarla con un algoritmo ricorsivo.  testate
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #27 on: 01-06-2010, 11:37:43 »

Quote
Applicando il seguente algoritmo:
- Trova la prima lista che non è piena, altrimenti creane una nuova
- Inserisci l'elemento al posto giusto

 

Una cosa, tu dici trova la prima lista libera sennò creane una nuova, ma non dovrei creare solo un nodo?
Cioè per esempio, il metodo add crea una lista se head è null, un nodo che prende come parametro un array (ListPerson) e inserisce l'elemento, se head non è null, faccio i confronti, e se lo spazio non basta inserisco dopo tail un altro nodo con un altro array, perchè creare un' altra lista?
Avrò capito male io...
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 #28 on: 01-06-2010, 11:46:35 »

Quote
Applicando il seguente algoritmo:
- Trova la prima lista che non è piena, altrimenti creane una nuova
- Inserisci l'elemento al posto giusto

 

Una cosa, tu dici trova la prima lista libera sennò creane una nuova, ma non dovrei creare solo un nodo?
Cioè per esempio, il metodo add crea una lista se head è null, un nodo che prende come parametro un array (ListPerson) e inserisce l'elemento, se head non è null, faccio i confronti, e se lo spazio non basta inserisco dopo tail un altro nodo con un altro array, perchè creare un' altra lista?
Avrò capito male io...
No scusami mi sono espresso male.  pray
Intendevo dire crea un nuovo nodo contenente l'array di cento elementi.  ok
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #29 on: 01-06-2010, 14:30:31 »

Ahhh!!!!!
Per fortuna perchè già stavo entrando nel panico...poi già io non capisco le cose che sono giuste 
Lo sapresti se mi conoscessi di persona........(       ).
Va bene ora vediamo che riesco a fare, ma.....ci provo in questo pomeriggio, anche se la vedo dura.. 
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: