Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Con 22 tasti, il pulsante 5D, lo Shift Mode e il sensore PixArt 3395 da 26.000 DPI, il nuovo mouse wireless di Mad Catz si rivolge in modo preciso ai giocatori di MMO e RPG. Ma chi conosce già il R.A.T. 8+ ADV si accorgerà subito di quanto i due prodotti condividano, e di dove invece divergono
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC
Abbiamo provato la Gigabyte Radeon RX 9070 GRE Gaming OC, nuova proposta RDNA 4 che si inserisce tra GeForce RTX 5060 Ti e RTX 5070. Prestazioni solide in rasterizzazione e ray tracing, frequenze elevate grazie all'overclock di fabbrica e raffreddamento efficace: ecco come si comporta nei nostri test.
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare
Con tripla lente, tracking sincronizzato, visione notturna a colori e controllo locale senza abbonamenti, la OMVI 3i WiFi porta la sicurezza domestica a un livello molto più moderno, ma senza trasformarla in un sistema complicato da installare o usare
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-05-2010, 15:13   #1
cdere
Senior Member
 
L'Avatar di cdere
 
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" );
in corrispondenza di ogni valore di tupla chiaramente c'è un attributo, io con tale algoritmo ordino l'array in base all'attributo che voglio

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);
            }
        }
    }
ok.. ora però mi sembra un po inutile reimplementare un algoritmo di sort.. quindi avevo pensato di utilizzare Arrays.sort (e implementare una delle 2 interfacce comparator o comparable)... solo che solo che... come faccio a "passargli" anche il nome dell'attributo per il quale deve ordinare i valori?


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 15:17.
cdere è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2010, 15:43   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2010, 16:36   #3
cdere
Senior Member
 
L'Avatar di cdere
 
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)
ma non so come chiamarlo:

Codice:
        Comparator<Tuple[]> c = null;
        Arrays.sort(data, beginExampleIndex, endExampleIndex, c);
data è il mio array di Tuple, invece per comparator non so proprio cosa mettere! bho non capisco proprio il senso.

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 16:43.
cdere è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2010, 16:49   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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;
    }
}
Crei la tua classettina che concretizza un Comparator<Tuple>:

Codice:
import java.util.Comparator;

public class TupleComparable implements Comparator<Tuple> {

    public int compare(Tuple o1, Tuple o2) {
        
    }

}
Secondo il contratto di Comparator, il metodo compare deve restituire un numero minore di zero se o1 è minore di o2, zero se o1 è uguale a o2, un numero maggiore di 1 se o1 è maggiore di 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]);
    }

}
Qui che succede? Succede che un certo TupleComparable confronta due Tuple usando la stringa in una certa posizione. A questo punto dato un array di Tuple:

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!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2010, 17:49   #5
cdere
Senior Member
 
L'Avatar di cdere
 
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" funziona!
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) );
        }

    }
Però, però... c'è un però... non so perchè, ma ogni ordinamento che effettua, l'ultima tupla non è ordinata, non so perchè, sempre l'ultima non c'entra nulla...

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
cdere è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2010, 18:11   #6
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12994
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
    }    
}
A questo punto poi:

Codice:
Tupla[] arr = new Tupla[] { ... };

Arrays.sort(arr);
Personalmente lo trovo un po' più elegante (ammesso cmq che si abbia accesso ai sorgenti della classe Tupla) .
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2010, 18:13   #7
cdere
Senior Member
 
L'Avatar di cdere
 
Iscritto dal: Feb 2001
Città: Foggia
Messaggi: 2519
o non ho capito io, o tu non hai letto la discussione io con TupleComparator ordino data (ricordo array di tuple) secondo l'attributo (tipo l'ORDER BY di SQL) (che passo al costruttore di TupleComparator) tu ordini e basta
__________________
mi sembra di essere tornato adolescente ai bei tempi.. che figata essere di nuovo su questo forum
cdere è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2010, 18:15   #8
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12994
Quote:
Originariamente inviato da cdere Guarda i messaggi
o non ho capito io, o tu non hai letto la discussione io con TupleComparator ordino data (ricordo array di tuple) secondo l'attributo (tipo l'ORDER BY di SQL) (che passo al costruttore di TupleComparator) tu ordini e basta
Forse ho letto male io .
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 08-05-2010, 18:22   #9
cdere
Senior Member
 
L'Avatar di cdere
 
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
cdere è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC Radeon RX 9070 GRE, AMD la porta in tutto il mon...
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare Reolink OMVI 3i WiFi: videosorveglianza pi&ugrav...
Recensione Vivo X300 Ultra: fotocamera eccezionale, ma prezzo proibitivo Recensione Vivo X300 Ultra: fotocamera ecceziona...
Xiaomi 17T Pro recensione: zoom Leica 5x e batteria silicio-carbonio per l'alternativa ai top Xiaomi 17T Pro recensione: zoom Leica 5x e batte...
Recensione OPPO Enco Clip2: tanta tecnol...
Altro passo dei cinesi in Europa: Chery ...
AMD FSR 4.1: l'architettura RDNA 3.5 pot...
L'Economist dice di non dare la colpa al...
Meta frena sul tracciamento dei dipenden...
Falla zero-click su Android, anche Linux...
AMD ha nascosto il vero segreto di EXPO ...
TRYX porta la personalizzazione a un nuo...
Designer di auto cinesi all'attacco di F...
Oltre 3.000 posti di lavoro a rischio: l...
Uber taglia il 23% del personale HR, ma ...
Amazon TOP 7 rinnovata: in posizione 2 u...
HTTP/2 Bomb: il nuovo attacco DoS che ab...
Assetto Corsa Evo v0.7: arrivano finalme...
2 portatili tuttofare Vivobook e Acer a ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:06.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v