2012-11-22 6 views
0

Lors de la création de 2 Queues comme ceci:Java multidisque Queues

ArrayQueue q1 = new ArrayQueue(); 
    ArrayQueue q2 = new ArrayQueue(); 
    for (int i = 0; i < 5; i++) { 
     q1.enqueue(new Integer(i)); 
    } 
    for (int i = 5; i < 10; i++) { 
     q2.enqueue(new Integer(i)); 
    } 
    System.out.println("q1: " + q1); 
    System.out.println("q2: " + q2); 

Il produit: q1: 4,3,2,1,0 et q2: 9,8,7,6,5.

J'ai besoin d'une méthode qui fusionne la file d'attente q2 dans la file d'attente q1 avec des éléments entrelacés. Donc, si println 'd encore sortirait: q1: 0,5,1,6,2,7,3,8,4,9 et q2: 9,8,7,6,5.

Ma classe contient toutes les méthodes appropriées enqueue, dequeue, peek, isEmpty, size, doubleSize ... mon nom de la méthode est la suivante:

public void mergedQs(ArrayQueue q) { 
    } 

Fondamentalement, je veux ajouter des objets à deux files d'attente, puis fusion la deuxième file d'attente dans le premier (pas seulement les ajouter). Idéalement je veux éviter de les lancer ou d'utiliser une ArrayList car je veux qu'ils restent des files d'attente.

+0

Je vous suggère d'utiliser le ConcurrentLikedDeque. Voici l'API pour cela [ConcurrentLinkedDeque] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html). Si vous avez déjà une classe avec des méthodes comme enqueue, dequeue etc, vous pouvez envelopper le ConcurrentLinkedDeque dans votre classe et l'utiliser comme structure de données principale pour stocker nos objets. – nikkatsa

Répondre

4

Vous pourriez trouver cela utile. Il fusionne n'importe quel nombre de files d'attente.

public static <T> Queue<T> mergeQs(Queue<T> ... qs) { 
    Queue<T> ret = new ConcurrentLinkedQueue<T>(); 
    boolean more; 
    do { 
     more = false; 
     for (Queue<T> q : qs) 
      if (!q.isEmpty()) { 
       ret.add(q.remove()); 
       more = true; 
      } 
    } while(more); 
    return ret; 
}