Java中的queue.remove()不工作

Java中的queue.remove()不工作,java,string,queue,Java,String,Queue,从队列中删除元素时遇到问题。通过广泛的调试,我发现所有的元素都被添加了,但是当我试图删除一个元素时,它一遍又一遍地给了我相同的元素。代码如下: private synchronized String accessMyQueue(char[] myInput) { String myOutput=""; myOutput=convertToString(myQueue.remove()); System.out.println("accessqueue removing:" +

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

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();
}

如果
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();
        }
    }
}
正如所料

所以,底线是,我认为我们需要看到更多的代码。很难想象,如果在
LinkedList
Queue
界面中有一个bug,数百万其他用户还不会发现它:-)


您还需要尝试放置
System.out.println(myQueue.size())在代码中的几个关键位置上划线,以查看队列发生了什么。这可能会告诉您发生了什么。

如果
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();
        }
    }
}
正如所料

所以,底线是,我认为我们需要看到更多的代码。很难想象,如果在
LinkedList
Queue
界面中有一个bug,数百万其他用户还不会发现它:-)


您还需要尝试放置
System.out.println(myQueue.size())在代码中的几个关键位置上划线,以查看队列发生了什么。这可能会告诉您发生了什么。

什么类型的对象是
myQueue
?您提供的代码段中没有声明它。什么类型的对象是
myQueue
?您提供的代码片段中没有声明这一点。@pax-众所周知,Jon Skeet可以在好的一天进行心理调试:-)他已经知道这个问题的答案,并且已经解决了,但他巧妙地保留了这些信息,以最大限度地为我们所有其他人提供学习机会。哦…哈哈…是的,我使用的是普通的java队列……声明如下:private Queue myQueue=new LinkedList();我对.remove()的理解是,它应该返回字符串并将其从队列中删除……这不对吗?如果有关系,我使用的是java 1。6@pax-众所周知,Jon Skeet可以在好天气进行心理调试:-)他已经知道这个问题的答案,并且已经解决了,但他巧妙地保留了这些信息,以最大限度地为我们其他人提供学习机会。哦……哈哈……是的,我使用的是普通的java队列……声明如下:private Queue myQueue=new LinkedList();我对.remove()的理解是,它应该返回字符串并将其从队列中删除……这不对吗?如果有关系,我使用的是java 1.6