PDA

View Full Version : [JAVA] Ordinamento vettore


f0/\/2!3
08-01-2008, 14:29
Ho un Vector di oggetti di tipo Tree da me definiti: se volessi ordinarli in ordine crescente prendendo come riferimento un parametro interno ad oggetti di tale tipo cosa dovrei usare?

So che esiste la libreria java.util.Collections che presenta un metodo sort dichiarato di questo tipo:

sort
public static <T> void sort(List<T> list,
Comparator<? super T> c)
Sorts the specified list according to the order induced by the specified comparator.
All elements in the list must be mutually comparable using the specified comparator (that is, c.compare(e1, e2)
must not throw a ClassCastException for any elements e1 and e2 in the list).
This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort.

The sorting algorithm is a modified mergesort (in which the merge is omitted if the highest element
in the low sublist is less than the lowest element in the high sublist). This algorithm offers guaranteed
n log(n) performance. The specified list must be modifiable, but need not be resizable. This implementation
dumps the specified list into an array, sorts the array, and iterates over the list resetting each element
from the corresponding position in the array. This avoids the n2 log(n) performance that would result from
attempting to sort a linked list in place.

Parameters:
list - the list to be sorted.
c - the comparator to determine the order of the list. A null value indicates that the elements' natural ordering should be used.
Throws:
ClassCastException - if the list contains elements that are not mutually comparable using the specified comparator.
UnsupportedOperationException - if the specified list's list-iterator does not support the set operation.
See Also:
Comparator
--------------------------------------------------------------------------------


Il problema è che non riesco ad utilizzarlo: forse il problema è con il fatto che lavoro con un vettore invece che con una lista anche se so se che un vettore implementa una lista...

andbin
08-01-2008, 14:59
Ho un Vector di oggetti di tipo Tree da me definiti: se volessi ordinarli in ordine crescente prendendo come riferimento un parametro interno ad oggetti di tale tipo cosa dovrei usare?

So che esiste la libreria java.util.Collections che presenta un metodo sortProprio questo. Nota che ci sono 2 sort, uno prende solo la List e l'altro prende la List e un Comparator.

Nel primo caso sort() si basa su Comparable, che deve essere implementato nella classe dei tuoi elementi. Nel secondo caso sort() si basa su Comparator, una interfaccia che devi implementare in una qualunque altra classe apposita per definire un ordinamento particolare.

Es.:

public class MyTreeComp implements Comparator<Tree>
{
public int compare (Tree t1, Tree t2)
{
// ... qui compara t1 e t2 secondo il criterio che vuoi ....
}
}

e poi:

Collections.sort (tuoVector, new MyTreeComp());

f0/\/2!3
08-01-2008, 16:36
Proprio questo. Nota che ci sono 2 sort, uno prende solo la List e l'altro prende la List e un Comparator.

Nel primo caso sort() si basa su Comparable, che deve essere implementato nella classe dei tuoi elementi. Nel secondo caso sort() si basa su Comparator, una interfaccia che devi implementare in una qualunque altra classe apposita per definire un ordinamento particolare.

Es.:

public class MyTreeComp implements Comparator<Tree>
{
public int compare (Tree t1, Tree t2)
{
// ... qui compara t1 e t2 secondo il criterio che vuoi ....
}
}

e poi:

Collections.sort (tuoVector, new MyTreeComp());

Grazie mille! pare funzionare ;)

f0/\/2!3
17-01-2008, 11:38
Ho due vettori e devo copiare un oggetto da un vettore all'altro, solo che l'oggetto copiato è lo stesso ovvero da debug noto che presenta lo stesso ID quindi ogni modifica effettuata sull'elemento interno al nuovo vettore influisce anche sull'originale... Come si può risolvere?

andbin
17-01-2008, 12:24
Ho due vettori e devo copiare un oggetto da un vettore all'altro, solo che l'oggetto copiato è lo stesso ovvero da debug noto che presenta lo stesso ID quindi ogni modifica effettuata sull'elemento interno al nuovo vettore influisce anche sull'originale... Come si può risolvere?Facendo così hai solo copiato il reference dell'oggetto. Ma l'oggetto resta 1 solo. Dovresti fare una "deep-copy" (copia profonda) dell'oggetto. Dipende da come è fatta la classe. Se implementa Cloneable e ridefinisce il metodo clone(), allora è clonabile. Altrimenti devi fare tu la copia in altro modo (es. creare una nuova istanza e copiare/clonare i campi).
Ma in ogni caso è necessario conoscere come è fatta la classe e quali campi contiene.

banryu79
17-01-2008, 12:33
Se stai facendo una cosa di questo tipo:

// primoVettore è il vettore che hai già popolato, da cui vuoi copiare gli oggetti

Vector secondoVettore = new Vector();

for(int i = 0; i < primoVettore.size(); i++) {
secondoVettore.add( primoVettore.elementAt(i) );
}

allora stai inserendo ogni "riferimento ad un oggetto" contenuto nel primo vettore nel secondo vettore; devi invece inserire i riferimenti alle copie degli oggetti originali (cioè a dei nuovi oggetti).

Una cosa del tipo:

// primoVettore è il vettore che hai già popolato, da cui vuoi copiare/clonare gli oggetti

Vector secondoVettore = new Vector();

for(int i = 0; i < primoVettore.size(); i++) {

// recupera riferimento ad oggetto originale
Elemento originale = (Elemento) primoVettore.elementAt(i);

// clona l'oggetto
Elemento nuovaCopia = metodoCheClona(originale);

// inserisci nel nuovo vettore il riferimento al nuovo oggetto copia
// dell'originale
secondoVettore.add( nuovaCopia);
}

dove in metodoCheClona() istanzierai un nuovo oggetto copia di quello originale.

Ciao :)


@EDIT:
scusa andbin, non avevo ancora letto il tuo post.

f0/\/2!3
17-01-2008, 18:07
grazie a tutti delle risposte ragazzi: ho usato un oggetto new in cui ho copiato le proprietà ed ho risolto per ora... Poi vediamo se alla fine mi da problemi :)