2015-01-06 1 views
-1

Зачем это было? Помимо того, что они не печатаются, элементы печатаются в неправильном порядке.Одиночный список с приоритетными клавишами, клавиши не печатаются

pq.enqueue(1,"Some"); 
    pq.enqueue(2,"Words"); 
    pq.enqueue(3,"Strange"); 
    pq.enqueue(4,"Very"); 
    System.out.println(pq.size()); 
    pq.dequeue(); 
    pq.printPQueue(); 
    System.out.println("Is the list empty? " +pq.isEmpty()); 

Выход для этого:

4 
Key = 0 Element= Strange 
Key = 0 Element= Words 
Key = 0 Element= Some 
Is the list empty? false 

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

Edit:

класса интерфейса, определить методы:

public interface PQInterface { 
    public void enqueue(int key, Object element); 
    public Object dequeue(); 
    public int size(); 
    public boolean isEmpty(); 
    public void printPQueue(); 
} 

класса Node (инкубационных и геттеров):

public class Node { 
    private int key; 
    private Object element; 
    private Node next; 

    public Node(int priority, Object e, Node n){ 
     element = e; 
     next = n; 
    } 

    public int getKey(){ 
     return key; 
    } 

    public void setKey(int val){ 
     key = val; 
    } 

    public Node getNext(){ 
     return next; 
    } 

    public void setNext(Node n){ 
     next = n; 
    } 

public Object getElement(){ 
    return element; 
} 

    public void setElement(Object e){ 
     element = e; 
    } 

    public String toString(){ 
     return element.toString(); 
    } 
} 

Наконец, класс MyPriorityQueue, который реализует методы определены в интерфейсе.

public class MyPriorityQueue implements PQInterface { 

private Node head; 
private int size; 
private Node curr; 
private Node prev; 

public MyPriorityQueue() { 
    head = null; 
    size = 0; 
    curr = null; 
    prev = null; 
} 

private void setCurrent(int index){ 
    prev=null; 
    curr=head; 
    for(int k=1; k<index; k++){ 
     prev=curr; 
     curr=curr.getNext(); 
    } 
} 

private int findInsertPosition(int newkey){ 
    Node aNode=head; 
    boolean found; 
    int position; 
    found=false; 
    position=1; 
    while(aNode!=null && !found){ 
     if(aNode.getKey()>newkey){ 
      aNode=aNode.getNext(); 
      position=position+1; 
     } 
     else{ 
      found=true; 
     } 
    } 
    return position; 
} 

public void add(int index, int priorkey, Object item){ 
    if(index==1){ 
     Node newNode = new Node(priorkey,item,head); 
     head=newNode; 
    } 
    else{ 
     setCurrent(index); 
     Node newNode = new Node(priorkey,item,curr); 
     prev.setNext(newNode); 
    } 
    size=size+1; 
} 

private void add(int priorkey, Object element){ 
    Node newNode = new Node(priorkey,element,null); 
    if(head==null){ 
     head=newNode; 
    } 
    else{ 
     setCurrent(size); 
     curr.setNext(newNode); 
    } 
    size=size+1; 
} 

@Override 
public void enqueue(int priorkey, Object item) { 
    int index; 
    index = findInsertPosition(priorkey); 
    if (index > size) { 
     add(priorkey, item); 
    } else { 
     add(index, priorkey, item); 
    } 

} 

@Override 
public Object dequeue(){ 
    Node toBeRemoved; 
    toBeRemoved = head; 
    head = head.getNext(); 
    size = size-1; 
    return toBeRemoved; 
} 

@Override 
public int size() { 
    return size; 
} 

@Override 
public boolean isEmpty() { 
    if (size == 0) { 
     return true; 
    } else { 
     return false; 
    } 
} 

@Override 
public void printPQueue(){ 
    Node aNode=head; 
    while(aNode!=null){ 
     System.out.println("Key = "+aNode.getKey()+" Element= "+aNode.getElement()); 
     aNode=aNode.getNext(); 
    } 
} 

}

+2

Вы должны отредактировать свой вопрос, включив в него весь соответствующий код. – Eran

+0

Хорошо, я включил весь код. –

ответ

1

Вы никогда не храните приоритет в объекте Node:

public class Node { 
    private int key; 
    private Object element; 
    private Node next; 

    public Node(int priority, Object e, Node n){ // priority parameter is not used 
     element = e; 
     next = n; 
    } 
    ... 

Вот почему ключ остается 0.

Изменить его:

public class Node { 
    private int key; 
    private Object element; 
    private Node next; 

    public Node(int priority, Object e, Node n){ 
     element = e; 
     next = n; 
     key = priority; 
    } 
    ... 
+0

Блестяще, спасибо. Хотя, когда я его запускаю, список печатается в обратном направлении. Ключи в порядке 3,2,1, а не 1,2,3. Это нормально? (Первый раз работает с SLL/p.queues). –

+0

@AdamHorrigan Не идея этой очереди приоритетов ставить элементы с более высоким приоритетом перед элементами с более низким приоритетом? Вы получаете список в порядке убывания приоритета. – Eran

0
public Node(int priority, Object e, Node n){ 
    element = e; 
    next = n; 
} 

Вы никогда не устанавливаете ключ в свой конструктор узлов.

public Node(int priority, Object e, Node n){ 
    element = e; 
    next = n; 
    this.key = priority; 
} 

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

  • Нет связанных вопросов^_^