为通用队列类制作toString()方法时逻辑错误

时间:2019-05-02 19:51:47

标签: java queue logic

我正在尝试为使用toString()的通用队列创建ArrayList方法。我在使用StringBuilder来使toString()方法返回的字符串的for循环中遇到麻烦。

当我尝试使用toString()打印这些对象之一时,得到Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1。 我认为问题出在读取T element = q.get(front - k);的行上,但我不确定。

front变量引用队列的前部,即要出队的下一个数字)。

public String toString() {

    //Create new StringBuilder
    StringBuilder sBuilder = new StringBuilder();

    //If q is empty, return so
    if(isEmpty())
        sBuilder.append("The queue is currently empty" + "\n");

    //else make the string
    else {

        sBuilder.append("The next item to get removed is " + front + ";\n");

        //for loop to create the rest of the list
        for (int k = 0; k < getSize(); k++) {

            //Set the element num, and find the element.
            int elementNum = k + 1;
            T element = q.get(front - k);

            //Print that element
            sBuilder.append("Element " + elementNum + " is " + element + ";\n");
        }
    }

    //return StringBuilder
    return sBuilder.toString();
}

这是入队的方法

public void enqueue(T t) {

    //Add to queue
    size++;
    q.add(rear, t);
    rear++;

}

这是出队的方法

public T dequeue() {

    //Minus Size
    size--;

    //Set the value to value
    T value = q.get(front);

    //set front equal to null for garbage collection
    q.set(front, null);

    //Update front
    front++;

    //return value
    return value;

}

我也有一个int getSize()方法和一个isEmpty()方法。

1 个答案:

答案 0 :(得分:0)

好的,我确实需要确保完整的实现,但这就是我认为的工作方式。您的前后都可能从零开始,并且当您添加元素时,您会在后面增加,因此队列后面的元素具有更高的索引。

所以说我们从一个空队列开始,并添加3个元素。前将为0,后将为3,大小将为3。(PS:您不需要大小变量,您可以使用后减负号)。因此,当您执行q.get(front-k)时,您将尝试获取索引为0(到目前为止还可以),-1和-2(这是您得到错误的地方)的元素。您将要执行q.get(front + k)或q.get(rear-k),具体取决于要打印元素的顺序。