2013-12-01 3 views
1

Я чувствую, что я слишком усложняю ситуацию, так как обнаруживаю, что существует так много граничных случаев. Это задание для университета, поэтому, пожалуйста, ТОЛЬКО ДАЙТЕ МНЕ СОВЕТЫ, а не код, который я могу скопировать/вставить. Я пытаюсь сделать очередь приоритетов, которая упорядочивает элементы, содержащие символ. Они должны быть размещены на значении приоритета, а затем в алфавитном порядке, если в приоритете есть конфликт. Проблема, которую я испытываю, - это вставить элементы. Вот код, который я в настоящее время:Как создать очередь приоритетов, которая также учитывает содержимое элемента?

public void insertItem(int priority, char content) { 
     boolean isSpecialCase = false; 
     PList current; 

     if (isEmpty()) { 
      high = new PList(priority, content, null, null); 
      low=high; 
      System.out.println(content + " has been added to an empty list"); 
      isSpecialCase = true; 

     } 

     if (priority >= high.getPriority() && content >= high.getContent() && !isSpecialCase) { 
      PList newItem = new PList(priority, content, high, null); 
      high.setBehind(newItem); 
      high = newItem; 
      isSpecialCase = true; 
      System.out.println(content + " has been added to a non empty list - highest priority"); 
     } 
     if (priority < low.getPriority() && !isSpecialCase) { 
      PList newItem = new PList(priority, content, null, low); 
      low.setNext(newItem); 
      low = newItem; 
      isSpecialCase = true; 
      System.out.println(content + " has been added to a non empty list - absolute lowest priority"); 
     } 
     if (priority == low.getPriority() && content > low.getContent() && !isSpecialCase) { 
      PList newItem = new PList(priority, content, low, low.getBehind()); 
      low.getBehind().setNext(newItem); 
      low.setBehind(newItem); 

      isSpecialCase = true; 
      System.out.println(content + " has been added to a non empty list - lowest priority-highest char"); 

     } 
     if (priority == low.getPriority() && !isSpecialCase) { 
      if (content < low.getContent()) { 
       PList newItem = new PList(priority, content, null, low); 
       low.setNext(newItem); 
       low = newItem; 
       isSpecialCase = true; 
       System.out.println(content + " has been added to a non empty list -lowest priority"); 
      } 
     } 



     current = high; 
     while (current.getNext() != null && !isSpecialCase) { 
      if (current.getPriority() >= priority) { 
       if (current.getContent() > content) { 
        PList newItem = new PList(priority, content, current.getNext(), current); 
        current.getNext().setBehind(newItem); 
        current.setNext(newItem); 
        break; 
       } 
      } 
      current = current.getNext(); 
     } 
    } 

кажется грязным и несколько повторяющихся так, поэтому я думаю, что я на ложном пути. Он работает в большинстве случаев, но, например, я получаю NullPointer когда я бегу:

PriQueue p = new PriQueue(); 
    p.insertItem(5, 'a'); 
    p.insertItem(5, 'a'); 
    p.insertItem(4, 'x'); 
    p.insertItem(4, 'a'); 
    p.insertItem(4, 'x'); 

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

Спасибо заранее

+1

Добавление stacktrace было бы полезно. –

+1

Вы знакомы с [Heap] (http://ru.wikipedia.org/wiki/Heap_%28data_structure%29)? –

+0

С помощью кучи, реализую ли я его, имея приоритет в качестве родителя, и дети будут упорядочены персонажем? – user1198778

ответ

0

Я согласен вы более усложняющих вещей, не давая полностью на объяснения следует рассмотреть возможность реализации интерфейса Comparable на ваших PList элементов. Затем, когда вы вставляете новый элемент, вы можете прокручивать список до listNode.compareTo(newNode) > 0, и именно там вы его вставляете.

Смежные вопросы