2013-02-06 14 views
6

Può sembrare sciocco, ma ha senso quando si ha oggetto di coppia (chiave, valore) e li si ordina in base ai tasti. Per illustrare il mio punto con il codice:In che modo PriorityQueue in Java ordina le voci duplicate?

public class Pair implements Comparable<Pair> { 
    private int value; 
    private int key; 

    public Pair(int key, int value) { 
     this.key = key; 
     this.value = value; 
    } 

    @Override 
    public int compareTo(Pair o) { 
     if (this.key > o.key) 
      return 1; 
     else if (this.key < o.key) 
      return -1; 
     return 0; 
    } 
} 

public class program { 
    public static void main(String[] args) { 
     PriorityQueue<Pair> queue = new PriorityQueue<Pair>; 
     queue.add(new Pair(1,1)); 
     queue.add(new Pair(1,2)); 
     queue.add(new Pair(1,3)); 

     Pair pair = queue.poll(); // What would be in pair? 
    } 
} 

Quale sarebbe in pair? Il primo o l'ultimo elemento aggiunto? O qualcuno di loro senza possibilità di decidere?

risposta

7

CodaConPriorita API fa promesse per questa situazione:

La testa di questa coda è l'elemento meno rispetto all'ordinamento specificato. Se più elementi sono legati per il minor valore, la testa è uno di questi elementi - i legami sono suddivisi in modo arbitrario. Le operazioni di recupero della coda eseguono il polling, la rimozione, l'occhiata e l'elemento di accesso all'elemento all'inizio della coda.

Ma è facile da testare. Aggiungere toString Per accoppiare

@Override 
public String toString() { 
    return key + " " + value; 
} 

e stampare il risultato del sondaggio

Pair pair = queue.poll(); // What would be in pair? 
    System.out.println(pair); 

esso stampa

1 1 
+1

+1 per l'unica risposta corretta. –

+1

Quindi, se ho capito bene, semplicemente non posso fare affidamento su quale sarà il valore che ottengo per primo? Perché dall'output sembra davvero che sia il comportamento "FIFO". – Petr

+1

Secondo API non è possibile, ma i miei test mostrano anche un comportamento simile a FIFO per lo stesso Pair.key. –

-3

Fondamentalmente un Queue è la prima struttura dati First in First.

In PriorityQueue il comparable -ity definisce l'ordine.

Come nel caso, la priorità di tutti gli Pair() è la stessa. quindi nessun cambiamento in ordine.

First-In-First-Out cioè Pairs (1,1) (1,2) (1,3)

Come per documentation

Le operazioni di recupero coda di sondaggio, rimuovere, sbirciatina, e l'accesso elemento l'elemento alla testa della coda .

+0

sarebbe meglio un commento è seguito da downvote, vedo nulla di male – TheWhiteRabbit

+3

risposta è Non corretto. L'ordine è indeterminato. – EJP

Problemi correlati