Pages: [1] 2 3   Go Down
Print
Author Topic: Esercizio sugli array espandibili.  (Read 5985 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.


« on: 19-05-2010, 19:36:37 »

Nell'esercizio:

Code:
Si realizzi una classe Java, denominata ListOfArray<E> che implementi
l'interfaccia OrderedSet<E> (mostrata nella pagina seguente). La nuova classe
ListOfArray<E> mantiene gli elementi dell'insieme all'interno di array di
dimensione fissa pari a 100. Quando lo spazio allocato nella struttura non è più
sufficiente per contenere tutti gli elementi inseriti viene creato un nuovo array di
dimensione 100 che permette di estendere lo spazio disponibile.
Tutti gli array allocati nella struttura sono organizzati in una lista linkata semplice.
Gli elementi sono memorizzati in ordine non decrescente.
Si realizzi in seguito una classe che implementi l'interfaccia Person (mostrata nella
pagine seguente) e si fornisca un programma Java che prenda in input un file
contenente una lista di persone (specificate da nome, cognome ed età) e restituisca
in output la medesima lista ordinata in senso non decrescente secondo i campi
cognome, nome ed età.
L'insieme deve essere gestito attraverso una classe ListOfArray<Person>.

Mi chiedevo:
Code:
Tutti gli array allocati nella struttura sono organizzati in una lista linkata semplice.
Significa che dovrei inserire gli array all'interno dei nodi della lista o che debba implementare gli array tramite lista?


Poi nell'interfaccia Person:
 
Code:
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

Ma che cosa si intende per valore maggiore che una persona ha rispetto ad un altro?
« Last Edit: 19-05-2010, 19:50:03 by Daréios » Logged

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

Posts: 1.079

Ogni cosa da me scritta è da intendersi come opinione personale e non come dato di fatto. Anche le eventuali dimostrazioni matematiche da me scritte saranno opinioni personali e quindi dovranno venire dimostrate da una terza parte di fiducia


WWW
« Reply #1 on: 19-05-2010, 21:08:14 »

Significa che gli array sono accessibili tramite i nodi della lista, come fai a implementare gli array con una lista scusa? Cheesy

Boh magari hanno un campo value le Person?
Logged

There are some OO programming languages. I will create the first -_-' language.

LtWorf
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #2 on: 19-05-2010, 21:14:22 »

Si deve prendere in input una lista di persone:

Antonio, Barbagallo, 12
Michele, Zafarana, 23
Roberta, Mapo, 56

Che sono persone con nome cognome ed età e bisogna riordinare la lista in base ai tre parametri e stamparla in ordine non decrescente.

Non capisco perchè è richiesto di usare la lista, dovrei creare un'altra classe a parte ovviamente.....
Logged

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

Posts: 1.079

Ogni cosa da me scritta è da intendersi come opinione personale e non come dato di fatto. Anche le eventuali dimostrazioni matematiche da me scritte saranno opinioni personali e quindi dovranno venire dimostrate da una terza parte di fiducia


WWW
« Reply #3 on: 20-05-2010, 09:03:08 »

Eh si l'idea degli esercizi è proprio quella di fare esercitare
Logged

There are some OO programming languages. I will create the first -_-' language.

LtWorf
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #4 on: 20-05-2010, 09:54:01 »

Eh si l'idea degli esercizi è proprio quella di fare esercitare

 yoh

Allora credi che per memorizzare nellal ista debba crearmi una mia classe Nodo e lista linkata giusto?
Poichè anche se non è richiesto devo trovare io gli strumenti utili alla risoluzione del problema...
Logged

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

Posts: 1.079

Ogni cosa da me scritta è da intendersi come opinione personale e non come dato di fatto. Anche le eventuali dimostrazioni matematiche da me scritte saranno opinioni personali e quindi dovranno venire dimostrate da una terza parte di fiducia


WWW
« Reply #5 on: 20-05-2010, 11:05:00 »

Si, a programmazione è vietatissimo usare le liste già pronte di java!
Logged

There are some OO programming languages. I will create the first -_-' language.

LtWorf
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #6 on: 24-05-2010, 22:28:23 »

Ma sei riuscito a risolevrlo l'esercizio? io ci ho messo mano ma mi sn fermata al compareTo... io ho stratturato il mio array espandibile come un array le cui locazioni sono occupate da nodi a loro volta contenenti oggetti di tipo E che in altre parole sarebbero le persone... e i metodi che utilizzo x lavorare sull'array sono quelli della linked list semplice... come l'hai sviluppato il programma tu?
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 #7 on: 24-05-2010, 22:39:53 »

Emh.....a dire il vero...non l'ho sviluppato, avevo iniziato un altro esercizio sulle liste che mi ha dato pure problemi, quindi non me ne sono occupato, ma ci torno, e ti faccio sapere.
Penso che la tua idea sia corretta, il problema, che già avevo intuito è fare il confronto....
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 #8 on: 25-05-2010, 14:02:47 »

Ragazzi io avrei dei dubbi sull'interfaccia OrderedSet<E>
Code:
interface OrderedSet<E>
{
// 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();
}
I metodi getFirst(), getLast() e add() (che immagino sia un inserimento ordinato) devono per forza fare dei confronti sui vari elementi di tipo E.
Così com'è specificata l'interfaccia, non abbiamo alcuna informazione sulla natura di E, come facciamo a confrontarli?
Non bisognerebbe imporre che il tipo generico E implementi l'interfaccia Comparable? Una cosa del genere
Code:
interface OrderedSet<E extends Comparable>
{
// ... metodi ...
}

Ovviamente anche l'interfaccia Person (che d'altrode ha già il metodo compareTo!) deve estendere Comparable in modo da poterla utilizzare come tipo in OrderedSet<E>.

Non vedo altra soluzione, anche se non mi sembra buono modificare le specifiche date dal pdf.
Qualcun'altro ha delle idee su come aggirare il problema?

Grazie
« Last Edit: 25-05-2010, 18:57:52 by XDnl » Logged
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #9 on: 26-05-2010, 07:33:41 »

Io per comparare gli oggetti di tipo E che in altre parole x noi sarebbero le Persone ho basato tutto sul metodo compareTo, in base allo stesso compareTo delle stringhe, xk l'ordinamento va fatto prendendo in considerazione prima il cognome e solo se il cognome uguale anche il nome... ancora a me nn funziona perfettamente ma il ragionamento dovrebbe esseere giusto
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 #10 on: 26-05-2010, 12:30:14 »

Io per comparare gli oggetti di tipo E che in altre parole x noi sarebbero le Persone
Ok, però nell'implementazione di ArrayList<E> abbiamo tipi generici.

ho basato tutto sul metodo compareTo, in base allo stesso compareTo delle stringhe, xk l'ordinamento va fatto prendendo in considerazione prima il cognome e solo se il cognome uguale anche il nome...
Esattamente, per confrontare nome e cognome anch'io ho utilizzato il compareTo delle stringhe.

ancora a me nn funziona perfettamente ma il ragionamento dovrebbe esseere giusto
Come hai implementato, ad esempio, il metodo add dell'interfaccia OrderedSet<E>?
Suppongo che questo metodo debba inserire l'elemento E al posto giusto (mantenendo cioè gli elementi in ordine non decrescente), d'altronde OrderedSet non significa insieme ordinato?  testate

Nell'implementare questo metodo, non ti serve effettuare il confronto tra due oggetti di tipo E?
Solo che non abbiamo alcuna informazione su quale oggetto sia E (indipendentemente poi dal fatto che il testo ci dica di implementare un ArrayList<Person>).
Una soluzione che ho pensato è imporre che l'oggetto generico E implementi l'interfaccia Comparable:

Code:
// Imponendo che E implementi Comparable, posso richiamare su di esso il compareTo
interface OrderedSet<E extends Comparable>
{
// ritorna true se l'insieme è vuoto
public boolean isEmpty();

// altri metodi...
}
Poi ho modificato anche Person, cambiando leggermente la firma di compareTo, in modo da rispettare le
specifiche dell'interfaccia Comparable

Code:
interface Person extends Comparable
{
// metodi..

// 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;

boolean equals(Object obj) throws ClassCastException;

}

Infine, ovviamente, ho imposto anche nella classe ArrayList che il tipo generico E debba estendere Comparable:
Code:
class ListOfArray<E extends Comparable> implements OrderedSet<E>
{
public static final int ARRAY_CAPACITY = 100;
private SLinkedList<BucketArray<E>> arrayList;

public ListOfArray()
{
arrayList = new SLinkedList<BucketArray<E>>();
}

// metodi...

// inserisce un nuovo elemento nell'insieme
public void add(E element)
{
// Vedo la prima lista libera
SNode<BucketArray<E>> arrayNode = arrayList.getHead();
while (arrayNode != null && arrayNode.getData().isFull())
arrayNode = arrayNode.getNext();

// Se tutte le liste sono piene
// Devo generarne una nuova
if (arrayNode == null)
arrayNode = arrayList.addTail(new BucketArray<E>(ARRAY_CAPACITY));

final BucketArray<E> myArray = arrayNode.getData();

// Devo inserire l'elemento in ordine all'interno di myArray.getData()
// Qui mi serve per forza il compareTo!
int pos = 0;
while (pos < myArray.getSize() && element.compareTo(myArray.at(pos)) < 0)
pos++;

myArray.addAt(pos, element);
}
}
Così sembra funzionare, ma come vedi ho dovuto modificare le interfacce specificate dal testo, per questo non sono sicuro che sia il modo giusto di svolgere l'esercizio.  testate
« Last Edit: 26-05-2010, 12:33:05 by XDnl » Logged
XDnl
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 376



« Reply #11 on: 27-05-2010, 16:50:01 »

Nessuna idea in proposito?  testate
Logged
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #12 on: 27-05-2010, 19:03:14 »

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);
}
}
Che in altre parole crea un nuovo nodo (che contiene un array di 100 locazioni in cui in ogni cella viene inserita la persona). Tutti i vari if sono x controllare se l'array è pieno cioè con tutti e 100 gli elementi o meno in modo da allocare un nuovo nodo o semplicemente riempire un'altra cella.
La classe compare nn la utilizzo
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 #13 on: 29-05-2010, 15:19:24 »

Scusate, sto provando ora a fare l'esercizio, siccome dice che bisogna memorizzare gli elementi in una linkedlist io avevo creato la classe Node e poila classica LinkedList, ma allora ho sbagliato, devo solo creare Node, e poi invece la lista la gestisco in questa class ArrayList giusto?
Creando head,tail......
P.S. non ho ben capito come fare i metodi getFirst() e getLast() della classe che implementa OrderedSet.
Ritornano l'elemento più grande e più piccolo dell'insieme.
Ma se abbiamo una lista di persone, più piccolo e più grande rispetto a cosa, all'età?
« Last Edit: 29-05-2010, 17:30:34 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 #14 on: 30-05-2010, 08:45:33 »

No, l'ordinamento deve essere fatto sempre prendendo in considerazione innanzitutto il cognome, se poi trovi due persone con lo stesso cognome allora vai a controllare il nome e se anche questo è uguale allora controlli l'età. La linked list deve essere in pratica questa tua classe particolare, non una classica linked list a parte
Logged

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

write once, run everywhere..
Pages: [1] 2 3   Go Up
Print
Jump to: