2012-06-26 3 views
0

Я сделал очередь блокировки приоритета. Внесение выполняется на основе приоритета. Когда я удаляю голову очереди, последний элемент очереди становится главой очереди, процедура повторяется. Предположим, что я вставил 123456789 в очередь.Priority Queue not maintying queue property

First deleted : 1; queue elements :92345678 
Second deleted: 9; queue elements :8234567 

и так далее.

Мне нужно получить свойство очереди, которое не поддерживается.

т.е. Первые удаления: 1 элементов очереди: 23456789
Второй удалить: 2 элемента очереди: 3456789

package com.block.ui; 

import java.util.Iterator; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 

public class PriorityBlockQueSamplActivity extends Activity { 
/** Called when the activity is first created. */ 

EditText et; 
EditText et2; 
Button b1; 
Button b2; 

Controller c ; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    et=(EditText)findViewById(R.id.editText1); 
    et2=(EditText)findViewById(R.id.editText2); 
    b1 =(Button)findViewById(R.id.button1); 
    b2 =(Button)findViewById(R.id.button2); 
    c= new Controller(); 


    Message m = new Message(); 
    m.mPriority=1; 
    m.Subject="1"; 
    c.insert(m); 

    Message n = new Message(); 
    n.mPriority=1; 
    n.Subject="2"; 
    c.insert(n); 
    Message p = new Message(); 
    p.mPriority=1; 
    p.Subject="3"; 
    c.insert(p); 

    Message q = new Message(); 
    q.mPriority=1; 
    q.Subject="4"; 
    c.insert(q); 


    b1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Iterator<Message> iter = c.getQueue().iterator(); 
      while(iter.hasNext()){ 
       Message m =iter.next(); 
       Log.i("MESSAGE", "Element "+m.Subject+" priority :"+m.mPriority); 
      } 

     } 
    }); 
    b2.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Message m=c.getMessage(); 
      c.delete(m); 

     } 
    }); 
} 

}

и еще один класс

`public class Controller { 

private int queueSize=300; 
Comparator<Message> comparator = new PriorityComaparator(); 
PriorityBlockingQueue<Message> qu = new PriorityBlockingQueue<Message>(queueSize,comparator); 

      public Controller() { 

} 

public void insert(Message msg) { 

    boolean status = qu.add(msg); 
    if (status) 
     log("Added successfully " + msg.Subject + " priority " 
       + msg.mPriority + " size :" + qu.size()); 
    else 
     log("Failed to add " + msg.Subject + " with priority " 
       + msg.mPriority); 

} 

public void delete(Message msg) { 
    if (qu.contains(msg)) { 
     boolean status = qu.remove(msg); 
     if (status) 
      log("deleted successfully " + msg.Subject + " priority " + msg.mPriority 
        + " size :" + qu.size()); 
     else 
      log("Failed to delete " + msg.Subject + " with priority "+ msg.mPriority); 
    } 
} 

public Message getMessage() { 
    return qu.peek(); 
} 

public PriorityBlockingQueue<Message> getQueue(){ 
    return qu; 
} 
void log(String msg) { 
    Log.i("QUEUE", msg); 
} 

class PriorityComaparator implements Comparator<Message> { 

    @Override 
    public int compare(Message m, Message n) { 
     int y = ((Message) m).mPriority; // 1 -highest 3-least 
     int z = ((Message) n).mPriority; 


     if (y < z) { 
      return -1; 
     } 
     if (y > z) { 
      return 1; 
      } 
      return 0; 
      } 

     } 

}` 
+0

* Почему * Вы переместить последний элемент в голову очереди? –

+0

Это то, что я вижу, когда я удаляю элемент в очереди – Meher

+1

Нам, вероятно, придется увидеть какой-то код. –

ответ

0

Если приоритет очередь, которую вы используете, - это ваша личная реализация, затем попробуйте кучу структура данных.

Как говорит вика страницы:

Куча один максимально эффективная реализация абстрактного типа данных называется очередью приоритетов.

Вот ссылка на page.

Помните, что в Java вам не нужно его реализовывать, вы можете использовать стандартный класс PriorityQueue или PriorityBlockingQueue, если вам нужно, чтобы он работал в многопоточной программе.

+0

shdn't i use priorityBlockingQueue? – Meher

+0

priorityBlockingQueue или PriorityQueue такие же, за исключением синхронизации. Моя проблема заключается в удалении элемента из очереди не в порядке, что мы обычно ожидаем @ dash1e – Meher

+0

Да, вы можете использовать PriorityBlockingQueue, если вам нужна синхронизация между многими потоками. – dash1e

2

Если, как и в вашем примере, все вставленные элементы имеют то же самое значение, то порядок поиска не определен. Из PriorityQueue (из которого PriorityBlockingQueue получает те же самые правила заказа):

Глава этой очереди является наименьшим элементом относительно указанного упорядочения. Если несколько элементов привязаны к наименьшему значению, голова является одним из этих элементов - связи сломаны произвольно.

(Курсив)

+0

поэтому я могу получить нормальное свойство очереди в этом случае ..! – Meher

+0

@meher - вы можете добавить enqueuedTime в 'Message', установить его во время вставки и использовать его в своем компараторе для разрыва связей между двумя сообщениями с тем же приоритетом. (Или введите класс обертки, если вы не можете напрямую изменить «Message»). –

+0

@ Damien_The_Unbeliever первый пункт имел в виду и вводил класс обертки, как это возможно, можно и объяснить мне ясно .. – Meher