Deque возвращает ноль для первого элемента после вставки - PullRequest
0 голосов
/ 09 апреля 2019

Когда я добавляю элемент в свою Deque и затем сразу пытаюсь проверить его, он возвращает ноль. Я убедился, что входящий элемент не равен нулю. В чем здесь проблема:

Уже пытался проверить, работают ли методы, метод add работает в DLL и в Deque. Я также пробовал queueTail и многократно выполняю очередь, и это все еще дает мне то же самое NullPointerException

Класс DoublyLinkedList

public class DLL<T>{
    private static class Node<T>{
        T element;
        Node<T> next;
        Node<T> prev;
        public T getElement() {
            return element;
        }
        public void setElement(T element) {
            this.element = element;
        }
        public Node<T> getNext() {
            return next;
        }
        public void setNext(Node<T> next) {
            this.next = next;
        }
        public Node<T> getPrev() {
            return prev;
        }
        public void setPrev(Node<T> prev) {
            this.prev = prev;
        }
        public Node(T ele, Node<T> n, Node<T> p) {
            element = ele;
            next = n;
            prev = p;
        }
    }

    Node<T> header;
    Node<T> trailer;
    int size;

    public DLL() {
        size = 0;
        header = new Node<>(null,null,null);
        trailer = new Node<>(null,null,header);
        header.setNext(trailer);
    }

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public T first() {
        if(isEmpty()) {
            return null;
        }
        return header.getNext().getElement();
    }

    public T last() {
        if(isEmpty()) {
            return null;
        }
        return trailer.getPrev().getElement();
    }

    private void addBetween(T ele,Node<T> before, Node<T> after) {
        Node<T> newN = new Node<T>(ele,after,before);
        before.setNext(newN);
        after.setPrev(newN);
        size++;
    }

    public void addFirst(T ele) {
        addBetween(ele,header.getNext(),header);
    }

    public void addLast(T ele) {
        addBetween(ele,trailer,trailer.getPrev());
    }

    private T remove(Node<T> rem) {
        Node<T> before = rem.getPrev();
        Node<T> after = rem.getNext();
        before.setNext(after);
        after.setPrev(before);
        size--;
        return rem.getElement();
    }

    public T removeFirst() {
        if(isEmpty()) {
            return null;
        }
        return remove(header.getNext());
    }

    public T removeLast() {
        if(isEmpty()) {
            return null;
        }
        return remove(trailer.getPrev());
    }

}

класс Deque

public class Deque<T>{
    private DLL<T> list = new DLL<>();
    public Deque() {
    }

    public void queueHead(T ele) {
        list.addFirst(ele);
    }

    public void queueTail(T ele) {
        list.addLast(ele);
    }

    public T popHead() {
        return list.removeFirst();
    }

    public T popTail() {
        return list.removeLast();
    }

    public boolean isEmpty() {
        return list.isEmpty();
    }

    public int size() {
        return list.size();
    }

    public T peakHead() {
        return list.first();
    }

    public T peakTail() {
        return list.last();
    }
}

Мой метод "Main", часть, которая запускается и пытается использовать Deque, добавив объект Graph ADT в Deque, а затем попытаться показать его с помощью toString ()

int population = Integer.parseInt((String) boxPopulation.getSelectedItem());
int perVacc = Integer.parseInt((String) boxVacc.getSelectedItem());
String disease = (String) boxDisease.getSelectedItem();
Disease d = null;
GraphMod grap = null;
com.graph.herdImmunity.Graph<Person> people;
if(disease.equalsIgnoreCase("Measles")) {
    d = new Disease("Measles",12,95,6.5);
    grap = new GraphMod(perVacc,d);
}
people = grap.initialise(population);//This just fills the graph with dummy data, this works I've tested

Deque<com.graph.herdImmunity.Graph<Person>> days = new Deque<>();

days.queueHead(people);

System.out.println(days.peakHead().toString());//this line gives me a nullpointerexception

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Java уже имеет Deque , который можно легко использовать с ArrayDeque . Если вы настаиваете на использовании того, что сделали, ваша проблема на самом деле довольно забавная. В

public void addFirst(T ele) {
        addBetween(ele,header.getNext(),header);
    }

Вы имели getNext() в параметре before.

Вместо этого должно быть

public void addFirst(T ele) {
        addBetween(ele,header,header.getNext());
    }

Также вам следует изменить имя «DLL» на другое, так как оно обычно называется «Dynamic Link Library».

0 голосов
/ 09 апреля 2019

Ваш addBetween не так. Он слишком сложный и имеет запутанно названные параметры. Это должно быть что-то вроде:

private void addAfter(T ele, Node<T> after) {
    Node<T> newN = new Node<T>(ele, after, after.getNext());
    after.getNext().setPrev(newN);
    after.setNext(newN);
    size++;
}

Наличие и after, и before всегда будет создавать проблемы, вы рискуете спутать их (как вы это сделали), и у вас нет гарантии, что они согласованы, что если я вызову метод с несовпадающей парой элементы, которые повредят весь список.

Затем вам нужно вызвать метод через:

public void addFirst(T ele) {
    addAfter(ele, header);
}

public void addLast(T ele) {
    addAfter(ele, trailer.getPrev());
}
...