queue.remove () в Java не работает - PullRequest
1 голос
/ 05 августа 2010

У меня проблемы с удалением элемента из очереди.с помощью обширной отладки я обнаружил, что все элементы добавляются, но когда я пытаюсь удалить один, он дает мне один и тот же элемент снова и снова.вот код:

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

1 Ответ

8 голосов
/ 05 августа 2010

Если myQueue является экземпляром стандартного Java-класса, реализующего интерфейс Queue, вероятность того, что вы обнаружите ошибку с ним, ... ну, достаточно близка к нулю, чтобы мы могли исключить ее как возможность .

Если, с другой стороны, вы внедрили свою собственную очередь, тогда, да, вполне может быть проблема, но, поскольку психическая отладка еще не является устоявшейся областью деятельности, вы нам нужно будет показать нам код для этого: -)

Я вижу одну из двух возможностей. Во-первых, вы каким-то образом устанавливаете для каждого узла своей очереди одно и то же значение, и вы вполне можете удалять элементы в порядке (вы можете обнаружить это, добавив один элемент, а затем пытаясь удалить два). Это гораздо более вероятно в языке, подобном 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();
        }
    }
}

Это выводит:

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)

как и ожидалось.

Итак, суть в том, что я думаю, что нам нужно увидеть больше вашего кода. Трудно представить, что если бы было ошибкой в ​​LinkedList или Queue интерфейсе, миллионы других пользователей еще не нашли бы его: -)

Вы также хотите попробовать поставить строку System.out.println (myQueue.size()); в нескольких стратегических местах в вашем коде, чтобы увидеть, что происходит с очередью. Это может дать вам представление о том, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...