Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329

    PriorityQueue settare l'ordinamento

    Salve vorrei capire come posso settare l'ordinamento di PriorityQueue, anzichè lasciare quella di default "natural ordering".

    In pratica ho un insieme di Sendatori che sendano MSG e che hanno un univoco ID...quindi vorrei mettere nella PQ questi Sendatori ma con un certo ordine:

    mettere in posizione più privilegiata (ovvero in testa alla PQ) il Sendatore che ha il MSG più lungo, ed a parità di lunghezza del MSG, mettere in testa chi ha il più basso ID.

    Adesso vorrei sapere non il codice per come realizzare l'ordine, ma come settare questo tipo di comportamento, ho letto che si fa implementando la classe Comparator o Comparable, facendo un overread del metodo "compare" , ma non ho ben capito.

    Grazie.
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: PriorityQueue settare l'ordinamento

    Originariamente inviato da Donovant
    Salve vorrei capire come posso settare l'ordinamento di PriorityQueue, anzichè lasciare quella di default "natural ordering".

    In pratica ho un insieme di Sendatori che sendano MSG e che hanno un univoco ID...quindi vorrei mettere nella PQ questi Sendatori ma con un certo ordine:

    mettere in posizione più privilegiata (ovvero in testa alla PQ) il Sendatore che ha il MSG più lungo, ed a parità di lunghezza del MSG, mettere in testa chi ha il più basso ID.

    Adesso vorrei sapere non il codice per come realizzare l'ordine, ma come settare questo tipo di comportamento, ho letto che si fa implementando la classe Comparator o Comparable, facendo un overread del metodo "compare" , ma non ho ben capito.
    PriorityQueue o sfrutta il Comparable degli oggetti contenuti (il "natural ordering") oppure un apposito Comparator.

    Definisci una classe a parte che implementa Comparator<TuaClasseDaComparare> e implementa il metodo compare() come lo richiede la interfaccia (vedi javadoc) in cui compari i due oggetti e ritorni il risultato della comparazione.
    Quindi crea il PriorityQueue con l'apposito costruttore che riceve il Comparator.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329
    Quindi dovrei:

    codice:
    private ComparatorMSG implements Compare{ // oppure Compare<MSG> ???
    
           public  int compare(ComparatorMSG uno, ComparatorMSG due){
                      .
                      .
                      .
                                   
           }
    
         //oppure //
    
           public  int compare(MSG uno, MSG due){//nel caso di Comparator<MSG>
                      .
                      .
                      .
                                   
           }
    
    }
    Una cosa ancora non ho capito, per una coda di PriorityQueue, io nel "compare" confronto solo 2 valori, che non ho capito bene nemmeno quali siano....
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Donovant
    quindi vorrei mettere nella PQ questi Sendatori
    Quindi nella PriorityQueue ci stanno oggetti Sendatori o MSG???

    Originariamente inviato da Donovant
    private ComparatorMSG implements Compare{ // oppure Compare<MSG> ???
    Comparator .... non Compare.

    E visto che se con almeno Java 5, allora meglio usare i generics, Comparator<Tipo> non solo Comparator.

    Originariamente inviato da Donovant
    public int compare(ComparatorMSG uno, ComparatorMSG due){
    //oppure //

    public int compare(MSG uno, MSG due){//nel caso di Comparator<MSG>
    I due parametri sono del tipo uguale agli oggetti contenuti nella collezione.

    Originariamente inviato da Donovant
    Una cosa ancora non ho capito, per una coda di PriorityQueue, io nel "compare" confronto solo 2 valori, che non ho capito bene nemmeno quali siano....
    Non ti interessa tanto sapere quali siano .... l'algoritmo di ordinamento ti passa 2 oggetti volta per volta. Tu devi solo dire, con il valore di ritorno del compare() se A<B, A>B o A=B.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329
    MSG -> sarebbeuna classe (o oggetto) che ha "ID" e "String".

    1) Quindi per la classe -> Comparator<mioOggetto>

    2) quindi -> compare(mioOggetto uno, mioOggetto due)?

    3) nel metodo compare "uno" e "due" cosa sono?, cioè fa confronti tra chi? primi, ultimi, non capisco questa cosa... oppure quando io faccio PQ.offer(mioOggetto), lui aggiunge mettendolo in priorità confrontandoli con tutti?... quindi "compare" è un metodo che utilizza la classe PriorityQueue quando fa un ADD di un oggetto?
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Donovant
    MSG -> sarebbeuna classe (o oggetto) che ha "ID" e "String".
    Ok, ora è chiaro. Ma Sendatori è un'altra tua classe? Prima come ne parlavi sembrava che fosse quella degli oggetti contenuti nel PriorityQueue!

    Originariamente inviato da Donovant
    1) Quindi per la classe -> Comparator<mioOggetto>

    2) quindi -> compare(mioOggetto uno, mioOggetto due)?
    Sì, se guardi la documentazione javadoc:

    Comparator<T> e il metodo è compare(T o1, T o2)

    Originariamente inviato da Donovant
    3) nel metodo compare "uno" e "due" cosa sono?
    Sono due degli oggetti presenti nella collezione

    Originariamente inviato da Donovant
    cioè fa confronti tra chi? primi, ultimi, non capisco questa cosa...
    Non ti interessa sapere "quali" siano davvero, se i primi due, il primo e l'ultimo o altri .... Lo "sa" l'algoritmo di ordinamento quali passarti di volta in volta!!
    Tralascia un momento PriorityQueue .... tu hai 3 oggetti (dico 3 per fare semplice) A B e C e vuoi ordinarli. Che fai? Compari prima A<-->B (se A>B, scambia) poi B<-->C (se B>C, scambia) poi di nuovo A<-->B (se A>B, scambia). Questo è il classico algoritmo "bubblesort". E lui "sa" la sequenza di coppie da comparare di volta in volta. Non devi saperlo/aspettartelo tu. Il senso è questo .... insomma.

    Originariamente inviato da Donovant
    lui aggiunge mettendolo in priorità confrontandoli con tutti?
    No, non con tutti ... PriorityQueue è basato internamente su un "heap" (è una specie di albero), quindi scandisce l'albero e fa confronti finché non trova il posto "giusto" dove inserire l'elemento.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di Donovant
    Registrato dal
    Sep 2005
    residenza
    London
    Messaggi
    1,329
    Ok tutto capito....vorrei solo fosse più chiara una cosa
    Se io creo "public class Comparato<MSG> implements Comparator{..."

    poi quando andrò ad intanziare, dovrò fare:

    int dim = 10;
    PriorityQueue PQ = new PriorityQueue(dim, new Comparator<MSG>);

    oppure in altro modo?

    Grazie mille per tutto cmq
    Beati gli smemorati, perchè avranno la meglio anche sui loro errori...

    My gallery: http://donovant.deviantart.com/gallery/

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Donovant
    Ok tutto capito....vorrei solo fosse più chiara una cosa
    Se io creo "public class Comparato<MSG> implements Comparator{..."

    PriorityQueue PQ = new PriorityQueue(dim, new Comparator<MSG>);
    No. Es.:

    public class MSGByIDComparator implements Comparator<MSG> { ..... }

    .....new PriorityQueue(dim, new MSGByIDComparator());
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.