Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Specificare l'ordine di un oggetto PriorityQueue?

    Sul mio libro dal quale sto studiando java, ho da poco affrontato la classe PriorityQueue. Di default gli elementi vengono ordinati automaticamente in modo ascendente, e c'è scritto che se si vuole specificare un particolare ordine, bisogna usare il costruttore che accetta un parametro Comparator... mi chiedo, ma come funziona? E' possibile specificare di disporre gli elementi come una normale coda? Nel senso che, il primo ad entrare è il primo ad uscire...

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

    Re: Specificare l'ordine di un oggetto PriorityQueue?

    Originariamente inviato da Dreamer89
    E' possibile specificare di disporre gli elementi come una normale coda? Nel senso che, il primo ad entrare è il primo ad uscire...
    Allora non usare PriorityQueue, usa un'altra collezione che può funzionare come "normale" coda, ad esempio tipicamente LinkedList.

    PriorityQueue serve per gestire una coda in cui l'ordine di uscita degli elementi non è dato dall'ordine di inserimento ma dal contenuto degli oggetti. C'è quindi un ordinamento degli elementi nella coda che si basa sui dati contenuti nell'oggetto e la comparazione può essere specificata con Comparable (dalla classe degli oggetti contenuti) o con Comparator (in una classe separata).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: Specificare l'ordine di un oggetto PriorityQueue?

    Originariamente inviato da andbin
    Allora non usare PriorityQueue, usa un'altra collezione che può funzionare come "normale" coda, ad esempio tipicamente LinkedList.

    PriorityQueue serve per gestire una coda in cui l'ordine di uscita degli elementi non è dato dall'ordine di inserimento ma dal contenuto degli oggetti. C'è quindi un ordinamento degli elementi nella coda che si basa sui dati contenuti nell'oggetto e la comparazione può essere specificata con Comparable (dalla classe degli oggetti contenuti) o con Comparator (in una classe separata).
    Ok ma in che modo utilizzo quel parametro Comparator? Come funziona? In quali modi è possibile ordinare una PriorityQueue?

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

    Re: Re: Re: Specificare l'ordine di un oggetto PriorityQueue?

    Originariamente inviato da Dreamer89
    Ok ma in che modo utilizzo quel parametro Comparator? Come funziona?
    Ti è chiaro come funzionano Comparable/Comparator?? L'avevo spiegato in questo post
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ma in quel post non c'è scritto come usarli... allora, io ho questo costruttore che accetta un parametro Comparator: new PriorityQueue (...)
    Quali sono i modi possibili di ordinamento? Come li specifico?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Dreamer89
    Quali sono i modi possibili di ordinamento?
    Ma lo devi specificare tu, implementando Comparator in una classe a sé stante!!! L'ordine lo stabilisci tu implementando in modo opportuno il compare().

    Ok, senti, esempio completo ... così chiarisco.

    codice:
    PriorityQueue<Integer> pq = new PriorityQueue<Integer> ();
    pq.offer (12);
    pq.offer (5);
    pq.offer (8);
    pq.offer (14);
    
    while (!pq.isEmpty ())
        System.out.println (pq.poll ());
    L'ordine di uscita (con cui sono stampati) non è l'ordine con cui sono stati inseriti!! Integer implementa Comparable, quindi PriorityQueue si basa su quello. E il Comparable di Integer stabilisce che l'ordine dei valori è crescente. Quindi l'ordine di stampa è 5 8 12 14

    Voglio ad esempio che il valore 12 venga sempre prima di tutti gli altri.

    codice:
    class MioComp implements Comparator<Integer>
    {
        public int compare (Integer i1, Integer i2)
        {
            int c = i1.compareTo (i2);
            
            if (c != 0)
            {
                if (i1 == 12)
                    c = -1;
                else if (i2 == 12)
                    c = +1;
            }
            
            return c;
        }
    }
    Poi

    PriorityQueue<Integer> pq = new PriorityQueue<Integer> (1, new MioComp());
    ....uguale a prima....

    L'ordine di uscita stavolta è 12 5 8 14
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ma quell'1 che hai messo come primo parametro del costruttore non dovrebbe essere la capacità? Comunque, grazie ho capito come si specifica un Comparator, anche se non ho capito cosa è quel metodo compare e i suoi argomenti come vengono trattati, e perchè quelle istruzioni che contiene

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Dreamer89
    Ma quell'1 che hai messo come primo parametro del costruttore non dovrebbe essere la capacità?
    La capacità iniziale. Che aumenta man mano che serve perché PriorityQueue è una coda "unbounded", senza limite di capacità.

    Originariamente inviato da Dreamer89
    Comunque, grazie ho capito come si specifica un Comparator, anche se non ho capito cosa è quel metodo compare e i suoi argomenti come vengono trattati, e perchè quelle istruzioni che contiene

    L'obiettivo di Comparable/Comparator è quello di stabilire se un oggetto A è minore/maggiore/uguale ad un oggetto B. Il criterio lo stabilisci tu. L'importante è che compareTo/compare ritorni <0, >0 o =0 rispettivamente se per te 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

  9. #9
    Quindi si ordinano gli elementi in base al risultato del metodo compare? Se ritorno +1 quindi mette l'elemento B all'inizio della coda?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Dreamer89
    Quindi si ordinano gli elementi in base al risultato del metodo compare?
    Chi usa Comparable/Comparator (una collezione ... Collections.sort() ... altro) si basa appunto su ciò che restituisce compareTo/compare.

    Originariamente inviato da Dreamer89
    Se ritorno +1 quindi mette l'elemento B all'inizio della coda?
    Se A<B allora A viene prima di B.

    P.S. Ho il dubbio sul codice di comparazione che ho scritto sopra ... ci devo ragionare...
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.