queue.remove Element trotzdem noch vorhanden.

  • Themenstarter Themenstarter QueueRemove
  • Beginndatum Beginndatum
Q

QueueRemove

Gast
Hallo Leute,

ich habe eine Java Queue:

Java:
Queue queue = new LinkedList<URL>();

In dieser Queue stecken also Java.net.URL drin.

Wenn ich nun z.B. folgendes mache (nur zum testen):

Java:
URL url = new URL("http://www.test.de");
queue.offer(url);

Ist die URL natürlich in der Queue. Jetzt aber mal das hier:

Java:
queue.remove(url);

Und die URL ist immer noch in der Queue oO
Wie kann ich also eine URL entfernen (nicht zurück geben, nur entfernen)?
 
Nein, der Code funktioniert. Nach dem remove() Aufruf ist die URL aus der LinkedList entfernt.

Wenns bei dir nicht der Fall ist dann hast du anderen Code als da oben.
 
remove und remove(Object o) entfernen beide Objekte, der eine immer den Kopf der andere das gegebene Element.
Du solltest mal schauen, was die zurückgeben 😉
Die booleans sagen dir, ob das Entfernen erfolgreich war.

Edit: Mist zu langsam!

Hier das Beispiel, in dem geht es wunderbar.
Java:
                Queue<URL> queue = new LinkedList<>();
		URL url = new URL("http://www.test.de");
		queue.offer(url);
		System.out.println("Remove Success: " + queue.remove(url));
 
Ich habe das ganze mit einem JUnit Test getestet!!!!!

Java:
@Test
public void testRemove() {
	queue.remove(url);
		
	assertFalse("The url should not be in the queue any more.", queue.contains(url));
}

Und dieser Test liefert ein Failure, was bedeutet, dass die URL nach wie vor in der queue ist
.....
 
höö? Der Test schlägt nur fehl wenn contains() true zurückliefert.

Poste doch mal deinen Test, damit wir den auch mal ausprobieren können.
 
Da hängt viel zu viel dran als das ich das posten könnte.

In meiner Warteschlange befinden sich ca. 5 Elemente vom Typ URL.

In meinem Test mache ich nun folgendes:

Java:
public class TestQueue {
	
        private static MyQueue queue;
	private static URL url;

	/**
	 * @throws java.lang.Exception
	 */
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		queue = new MyQueue();
		url = new URL("http://www.test.de");
	}
	
	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		queue.offer(url);
	}

	/**
	 * Test method
	 */
	@Test
	public void testRemove() {
		System.out.println("" + queue.remove(url)); // hier wird true ausgegeben
				
		System.out.println(queue.isEmpty()); // hier false, weil ich mehrere Elemente in der queue habe
		assertFalse("The url should not be in the queue any more.", queue.contains(url)); // hier failure
	}
}
 
Ahhh.. dummer JUnit-Anfänger Fehler meiner seits.
Ich habe natürlich weitere Tests in der Klasse und mache
Jedes mal bei setUp() ein offer, weshalb das Element natürlich
öfters drin ist.

Ausm setUp() rauß und schon funktionierts.
 
Ich hab deine Klasse MyQueue durch ne Queue ersetzt. Der Test läuft durch.

Warum ist url in deinem Test static? Kann es sein dass sich die url öfter in deiner Queue befindet? Ein remove() Aufruf löscht dann nur das erste Vorkommen der URL aus der Queue. Ein contains() würde dann immernoch true liefern.
Ansonsten muss der Fehler in deiner MyQueue Klasse liegen.
 
Jup du hast vollkommen recht, siehe meinen letzten Post.

Und die url ist static weil die JUnit-Methode

Java:
@BeforeClass
public static void setUpBeforeClass() throws Exception {
        
}

static ist.
 

Zurück
Oben