Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    81

    Ordinare gli elementi di una coda a priorità

    Ciao a tutti, devo copiare gli elementi di una lista contenente coppie di candidati in una coda a priorità in cui gli elementi siano ordinati in ordine di rango.

    Ho scritto una classe Candidate:

    codice:
    public class Candidate extends ObjectAbstract {   
    private int rank;    
    private String candidateParent;     
    private String id;
    una classe PairCandidate:

    codice:
    public class PairCandidate implements Comparable {      
    private Candidate c1;     
    private Candidate c2;     
    private int rank;      
        
    public PairCandidate(Candidate c1, Candidate c2, int rank) {         
    this.c1 = c1;         
    this.c2 = c2;         
    this.rank = rank;     }      
    
    public int compareTo(Object pair) {         
    int rank1 = this.getRank();        
    int rank2 = ((PairCandidate) pair).getRank();         
    Integer r1 = new Integer(rank1);
    Integer r2 = new Integer(rank2);
    return r1.compareTo(r2);       }
    A questo punto copio la lista contenente elementi PairCandidate nella coda:

    codice:
     
    PriorityQueue<PairCandidate> open; open = new PriorityQueue<PairCandidate>(listPair);
    Il problema è che alcuni elementi sono ordinati altri no. Dove può essere il problema ?
    Grazieeeeee

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

    Re: Ordinare gli elementi di una coda a priorità

    Originariamente inviato da tina8
    codice:
    public int compareTo(Object pair) {         
        int rank1 = this.getRank();        
        int rank2 = ((PairCandidate) pair).getRank();         
        Integer r1 = new Integer(rank1);
        Integer r2 = new Integer(rank2);
        return r1.compareTo(r2);
    }
    Il problema è che alcuni elementi sono ordinati altri no. Dove può essere il problema ?
    Innanzitutto visto che usi i "generics", dovresti sfruttarli anche nella implementazione di Comparable.

    Il compareTo comunque mi pare corretto. Nel senso che compara correttamente basandosi sui "rank" dei due PairCandidate (il this e quello passato al compareTo). Non si vede la implementazione di getRank() ma suppongo che restituisca proprio il rank di PairCandidate.

    Puoi descrivere meglio, magari con un esempio, quali dati hai realmente e cosa vedi di sbagliato come risultato finale?
    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
    Registrato dal
    Apr 2009
    Messaggi
    81
    Ho una lista iniziale di elementi (listPair) contentente:
    - pair(m1,m2 rank 24)
    - pair(t1,t2 rank 8)
    - pair(a1,a3 rank 2)
    - pair(a1,a4 rank 2)
    - pair(a1,a5 rank 2)
    - pair(a2,a3 rank 2)
    - pair(a2,a4 rank 2)
    - pair(a2,a5 rank 2)

    quando copio listPair nella coda a priorità (open) e stampo il contenuto della coda a priorità ottengo gli elementi nel seguente ordine:

    - pair(a1,a4 rank 2)
    - pair(a2,a5 rank 2)
    - pair(a1,a3 rank 2)
    - pair(t1,t2 rank 8)
    - pair(a1,a5 rank 2)
    - pair(a2,a3 rank 2)
    - pair(a2,a4 rank 2)
    - pair(m1,m2 rank 24)

    per cui la coppia t1,t2 non è ordinata in modo corretto, io vorrei invece:

    - pair(a1,a4 rank 2)
    - pair(a2,a5 rank 2)
    - pair(a1,a3 rank 2)
    - pair(a1,a5 rank 2)
    - pair(a2,a3 rank 2)
    - pair(a2,a4 rank 2)
    - pair(t1,t2 rank 8)
    - pair(m1,m2 rank 24)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tina8
    ottengo gli elementi nel seguente ordine:

    - pair(a1,a4 rank 2)
    - pair(a2,a5 rank 2)
    - pair(a1,a3 rank 2)
    - pair(t1,t2 rank 8)
    - pair(a1,a5 rank 2)
    - pair(a2,a3 rank 2)
    - pair(a2,a4 rank 2)
    - pair(m1,m2 rank 24)
    Ok, credo di aver capito/intuito la questione. Ora viene una bella domanda: come prendi i dati dal PriorityQueue?

    Perché se lo fai con l'iteratore (o intrinsecamente con il for-each) è sbagliato. La documentazione di iterator() di PriorityQueue dice chiaramente:

    The iterator does not return the elements in any particular order..
    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
    Registrato dal
    Apr 2009
    Messaggi
    81
    Grazie questo particolare mi era sfuggito, gli elementi sono ordinati !!!

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.