我正在尝试为使用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()
方法。
答案 0 :(得分:0)
好的,我确实需要确保完整的实现,但这就是我认为的工作方式。您的前后都可能从零开始,并且当您添加元素时,您会在后面增加,因此队列后面的元素具有更高的索引。
所以说我们从一个空队列开始,并添加3个元素。前将为0,后将为3,大小将为3。(PS:您不需要大小变量,您可以使用后减负号)。因此,当您执行q.get(front-k)时,您将尝试获取索引为0(到目前为止还可以),-1和-2(这是您得到错误的地方)的元素。您将要执行q.get(front + k)或q.get(rear-k),具体取决于要打印元素的顺序。