2012-11-21 38 views
0

我想知道最好的方法來編寫一個方法來合併一個ArrayQueue與另一個隊列,而無需從傳遞的q中刪除任何元素。Java中的合併隊列

eg. queue1 = [1,2,3,4] and queue2 = [5,6,7,8,9,10]. 

queue1.mergeQs(queue2)被稱爲它將創造queue1 = [1,5,2,6,3,7,4,8,9,10]同時queue2仍將[5,6,7,8,9,10]

public void mergeQs(ArrayQmerge q){} 

這種方式似乎難度比如果你是通過兩個隊列,並返回一個新的合併隊列來實現。謝謝。

只是爲了澄清,我正在尋找交錯從兩個隊列中的元素的方法。

+0

值得注意的是:Java中沒有'ArrayQueue'類。有'ArrayDeque'和'ArrayBlockingQueue',但是 - 你的意思是其中的一個嗎? – thkala

+0

我創建了自己的ArrayQueue類,實現了我自己的Queue類。 ArrayQmerge類擴展了ArrayQueue類。 – binary101

+0

確實讓任何人都難以回答你的問題。既然你可以看到'ArrayQueue'。 –

回答

1

一個細節,可以幫助你的是,私有字段相同類在Java中不同的對象之間可見。這意味着只要您只打算合併自己班級的隊列,您的代碼就可以完全訪問所有內部字段,例如用於存儲元素的數組。由於您使用的是自己的自制ArrayQueue

public void mergeQs(ArrayQmerge q) { 
    Object[] array = new Object[this.size() + q.size()]; 

    int i; 
    int o; 

    // Interleave elements 
    for (i = 0, o = 0; i < this.size() && i < q.size(); ++i) { 
     array[o++] = this.array[i]; 
     array[o++] = q.array[i]; 
    } 

    // Copy the remaining elements 
    while (i < this.size()) { 
     array[o++] = this.array[i++]; 
    } 

    while (i < q.size()) { 
     array[o++] = q.array[i++]; 
    } 

    this.array = array; 
} 
0

您可以在合併方法中本地創建一個新的隊列,然後將您的班級隊列分配給本地版本。

0

對於最簡單的情況下,如果所有元素都存儲與隊列頭處於指數爲零的線性陣列中,這樣的事情可能是一個開始那麼這就是猜想。

創建一個新的隊列並返回正如我認爲你已經說過的那樣更容易,更高效,因爲將元素插入Array支持的結構將涉及將每個插入操作的其餘元素向下移動一個位置。

另一種方法是通過交換你已經支持的底層數組來實現public void mergeQs(ArrayQmerge q)。因此,您可以獲得與返回新隊列相同的簡單實施,但是具有相同的就地副作用。