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