|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
|
[JAVA] Ordinare array secondo "qualcosa" e Arrays.sort
Salve a tutti
Ho questo problemino... ho questo algoritmo di quicksort (che funziona e anche bene) perchè ordini un array di "tuple" (sostanzialmente una matrice) in base al nome della "colonna" (cioè in base ai valori che sono in 'attributo' che è la colonna di questa matrice non in base a tutti i valori) vi posto la "matrice" (in realtà un'array di classe Tupla) e l'algoritmo: Codice:
data = new Tuple[14];
/* D1 */ data[0] = new Tuple( "Sunny","Hot","High","Weak","No" );
Codice:
void sort(Attribute attribute, int beginExampleIndex, int endExampleIndex){
quicksort(attribute, beginExampleIndex, endExampleIndex);
}
// scambio esempio i con esempio j
private void swap(int i,int j){
Object temp;
for (int k=0; k<getNumberOfExplanatoryAttributes()+1; k++){
temp = data[i].getValue(k);
data[i].setValue(k, data[j].getValue(k) );
data[j].setValue(k, temp);
}
}
/*
* Partiziona il vettore rispetto all'elemento x e restiutisce il punto di separazione
*/
private int partition(DiscreteAttribute attribute, int inf, int sup){
int i, j;
i=inf;
j=sup;
int med = (inf+sup)/2;
String x = (String)getExplanatoryValue(med, attribute.getIndex());
swap(inf, med);
while (true){
while(i<=sup && ((String)getExplanatoryValue(i, attribute.getIndex())).compareTo(x)<=0)
i++;
while(((String)getExplanatoryValue(j, attribute.getIndex())).compareTo(x)>0)
j--;
if(i<j)
swap(i,j);
else break;
}
swap(inf,j);
return j;
}
/*
* Algoritmo quicksort per l'ordinamento di un array di interi A
* usando come relazione d'ordine totale "<="
* @param A
*/
private void quicksort(Attribute attribute, int inf, int sup){
if(sup >= inf){
int pos;
pos = partition((DiscreteAttribute)attribute, inf, sup);
if ((pos-inf) < (sup-pos+1)) {
quicksort(attribute, inf, pos-1);
quicksort(attribute, pos+1, sup);
}
else
{
quicksort(attribute, pos+1, sup);
quicksort(attribute, inf, pos-1);
}
}
}
Grazie mille ragazzi! siete grandi
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum Ultima modifica di cdere : 08-05-2010 alle 16:17. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Puoi usare il sort di Arrays che accetta come secondo argomento un Comparator<T> dove T è il tipo di componenti dell'array (se sono stringhe sarà string, se sono tuple sarà tuple). Il comparator ha un metodo ad hoc (compare) attraverso il quale stabilisci la tua relazione d'ordine.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
|
tu parli giustamente di questo (perchè a me servono anche gli estremi degli indici):
Codice:
public static <T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c) Codice:
Comparator<Tuple[]> c = null;
Arrays.sort(data, beginExampleIndex, endExampleIndex, c);
EDIT: ma posso passare una stringa a Compare? (cioè il nome dell'attributo per quale voglio ordinare) e se si, come ?
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum Ultima modifica di cdere : 08-05-2010 alle 17:43. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Comparator è un'interfaccia, devi creare una classe che la implementi. Puoi usare la forma anonima o no. Di solito se una certa definizione appare una sola volta nel programma, in ragione di certe sue particolarità, si usa una classe anonima. Diciamo che la tua classe Tuple è questa:
Codice:
public class Tuple {
private final String[] data;
public Tuple(String[] data) {
this.data = data;
}
public String[] getData() {
return data;
}
}
Codice:
import java.util.Comparator;
public class TupleComparable implements Comparator<Tuple> {
public int compare(Tuple o1, Tuple o2) {
}
}
Mi pare vagamente di capire che l'ordine dipenda dall'indice del componente dell'array di tuple. Puoi dire una cosa del genere: Codice:
import java.util.Comparator;
public class TupleComparable implements Comparator<Tuple> {
private final int componentIndex;
public TupleComparable(int componentIndex) {
this.componentIndex = componentIndex;
}
public int compare(Tuple o1, Tuple o2) {
return o1.getData()[componentIndex].compareTo(o2.getData()[componentIndex]);
}
}
Tuple[] elementi = qualcosa ordini l'array dicendo: Arrays.sort(elementi, new TupleComparable(0)); o new TupleComparable(1), come vuoi.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
|
grazie mille PGI-Bis sei stato davvero disponibilissimo, chiaro ed esauriente. Non avrei potuto chiedere di più! Infatti il "robo" Codice:
public class TupleComparator implements Comparator<Tuple>{
private int index;
public TupleComparator(Attribute attribute) {
index = attribute.getIndex();
}
@Override
public int compare(Tuple rec1, Tuple rec2) {
return ((String)rec1.getValue(index)).compareTo( (String)rec2.getValue(index) );
}
}
so che praticamente non ho detto niente, ma magari è un problema "comune" in questi casi, idee? EDIT: c'era un -1 all'endIndex.. che dire risolto, GRAZIE
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12904
|
Si può fare anche così, senza creare un'altra classe:
Codice:
class Tupla implements Comparable<Test>
{
...
attributi di classe
...
...
metodi di classe
...
public int compareTo(Test o) {
// ritorna -1, 0, 1 a seconda dei casi
}
}
Codice:
Tupla[] arr = new Tupla[] { ... };
Arrays.sort(arr);
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
|
o non ho capito io, o tu non hai letto la discussione
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12904
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
|
ok ok figurati
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:29.




















