Java中的queue.remove()无法正常工作

1 java string queue

我在从队列中删除元素时遇到问题.通过广泛的调试,我发现所有元素都被添加,但是当我尝试删除它时,它会一遍又一遍地给我相同的元素.这是代码:

private synchronized String accessMyQueue(char[] myInput) {
   String myOutput="";
   myOutput=convertToString(myQueue.remove());
   System.out.println("accessqueue removing:" + myOutput);
}

//and so you can see what's going on in convertToString...

private String convertToString(char[] a) {
   String myString = new String(a);
   return myString.trim();
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 8

如果myQueue是实现Queue接口的标准Java类的实例,那么您发现它的错误的机会是......好吧,接近于零,我们可以将其作为一种可能性进行折扣.

另一方面,如果你已经实现了自己的队列,那么,是的,可能存在问题,但是,由于通灵调试还不是一个成熟的领域,你将不得不向我们展示代码:-)

我看到两种可能性中的一种.第一个是你以某种方式将队列的每个节点设置为相同的值,你可能正好删除项目(你可以通过添加一个项目然后尝试删除两个来检测这一点).这种情况更可能出现在像C这样的语言中,你可能会无意中重用相同的指针,但在Java中改进字符串的可能性要小得多.

第二个也是最有可能的是你在调用时没有从队列中删除元素remove,而是在不调整底层数据结构的情况下返回字符串(或者,错误地调整它).

没有看到代码,那就和我能做的一样好.


在你确实使用的更新后LinkedList,我想我会用一个非常简单的例子给它一个镜头xx.java:

import java.util.LinkedList;
import java.util.Queue;
public class xx {
    public static void main (String args[]) {
        Queue<String> myQueue = new LinkedList<String>();
        myQueue.add ("abc");
        myQueue.add ("def");
        System.out.println (myQueue.size());
        System.out.println (myQueue.remove());
        System.out.println (myQueue.size());
        System.out.println (myQueue.remove());
        System.out.println (myQueue.size());
        try {
            System.out.println (myQueue.remove());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这输出:

2
abc
1
def
0
java.util.NoSuchElementException
    at java.util.LinkedList.remove(LinkedList.java:805)
    at java.util.LinkedList.removeFirst(LinkedList.java:151)
    at java.util.LinkedList.remove(LinkedList.java:498)
    at xx.main(xx.java:14)
Run Code Online (Sandbox Code Playgroud)

正如所料.

所以,最重要的是,我认为我们需要看到更多的代码.这是很难想象的是,如果在一个错误LinkedListQueue接口,它不会被成千上万的其他用户发现尚未:-)

您还想尝试将System.out.println (myQueue.size());代码放在代码中的几个重要位置,以查看队列中发生的情况.这可能会告诉您发生了什么.