2010-08-05 3 views
1

Je rencontre des problèmes pour supprimer un élément de la file d'attente. grâce à un débogage complet, j'ai trouvé que tous les éléments sont ajoutés, mais quand j'essaie d'en supprimer un, cela me donne le même élément encore et encore. voici le code:queue.remove() en Java ne fonctionne pas

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

Quel type d'objet est 'myQueue'? Ce n'est pas déclaré dans l'extrait que vous avez fourni. –

Répondre

8

Si myQueue est une instance d'une classe Java standard qui implémente l'interface Queue, la chance que vous avez trouvé un bug avec elle sont ... eh bien, assez proche de zéro que nous pouvons escomptez-le comme une possibilité.

Si, d'autre part, vous avez implémenté votre propre propre file d'attente alors, oui, il peut y avoir un problème mais, puisque le débogage psychique n'est pas encore un domaine d'activité bien établi, vous allez avoir à nous montrer le code pour cela :-)

Je vois une de deux possibilités. La première est que vous êtes en quelque sorte en train de définir chaque noeud de votre file d'attente à la même valeur et vous pouvez très bien supprimer des éléments (vous pouvez le détecter en ajoutant un élément puis en en supprimant deux). C'est beaucoup plus probable dans un langage comme C où vous pouvez réutiliser le même pointeur par inadvertance, mais c'est beaucoup moins probable dans Java avec ses chaînes améliorées.

La seconde et la plus probable est que vous n'êtes pas retirer l'élément de la file d'attente lorsque vous appelez remove, plutôt vous retournez la chaîne sans ajuster quelle que soit votre structure de données sous-jacente est (ou, à défaut, en l'ajustant à tort).

À moins de voir le code, c'est à peu près aussi bon que je peux le faire.


Après votre mise à jour que vous étiez en effet utilisé LinkedList, je pensais que je donnerais un coup de feu avec un exemple très simple 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(); 
     } 
    } 
} 

Ce sorties:

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) 

comme prévu. Donc, en bout de ligne, je pense que nous aurons besoin de voir plus de votre code. Il est difficile de concevoir que, s'il y avait un bogue dans LinkedList ou l'interface Queue, il n'aurait pas encore été trouvée par les millions d'autres utilisateurs :-)

Vous voulez également essayer de mettre la ligne System.out.println (myQueue.size()); à quelques endroits stratégiques dans votre code pour voir ce qui se passe avec la file d'attente. Cela peut vous donner une indication sur ce qui se passe.

+1

@pax - c'est un fait bien connu que Jon Skeet peut faire du débogage psychique lors d'une bonne journée :-) –

+0

Il connaît déjà la réponse à ce problème et l'a corrigé, mais il retient intelligemment l'information pour maximiser l'opportunité d'apprentissage pour tout le reste d'entre nous. – duffymo

+0

oops ... haha ​​... oui, j'utilise la file d'attente java normale ... voici la déclaration: privée File d'attente myQueue = new LinkedList (); – user411406