2010-04-21 18 views
6

我有一些字符串[]數組,例如:如何在Java中混合兩個數組?

['a1', 'a2'] 
['b1', 'b2', 'b3', 'b4'] 
['c1'] 

如何可以將它們混合,使我得到['a1', 'b1', 'c1', 'a2', 'b2', 'b3', 'b4'](0元件的,則b,C,A,B,C的1個元件等等)?謝謝

更準確地說,結果數組必須包含第一個數組的第一個值,然後是第二個數組的第一個值,...,最後一個數組的第一個值,第一個數組的第二個值, ...,最後一個數組的第二個值,...,最大數組的最後一個值。如果數組的大小不一樣,那麼小數字就不會被考慮在內。

這裏有一個例證:

a1 a2 a3 a4 
b1 b2 b3 b4 b5 b6 b7 
c1 c2 
d1 d2 d3 d4 d5 

Combines into (brackets are just to highlight steps, so they really mean nothing): 
(a1 b1 c1 d1) (a2 b2 c2 d2) (a3 b3 d3) (a4 b4 d4) (b5 d5) (b6) (b7) 

另外,我想可變數量的結合數組,而不是僅僅3或4

+0

你能更準確地描述它們應該如何混合? – Roman 2010-04-21 10:29:11

回答

17
String result[] = new String[a.length+b.length+c.length]; 
for (int i = 0, j = 0; j < result.length; ++i) { 
    if (i < a.length) { 
     result[j++] = a[i]; 
    } 
    if (i < b.length) { 
     result[j++] = b[i]; 
    } 
    if (i < c.length) { 
     result[j++] = c[i]; 
    } 
} 

更新:更普遍

String[] merge(String[]... arrays) { 
    int length = 0; 
    for (String[] a: arrays) { 
     length += a.length; 
    } 
    String result[] = new String[length]; 
    for (int i = 0, j = 0; j < length; ++i) { 
     for (String[] a: arrays) { 
      if (i < a.length) { 
       result[j++] = a[i]; 
      } 
     } 
    } 
    return result; 
} 
+2

+1對於可變參數...現在讓它成爲一個通用的方法, T [] merge(T [] ... arrays)和我們在說話;)做得好 – basszero 2010-04-21 11:15:24

+0

@basszero:是的,這是個好主意 – 2010-04-21 11:29:38

+0

@ basszero:雖然有一點問題:不允許創建一個泛型類型的數組。 – 2010-04-21 11:35:18

-1
ArrayList al = new ArrayList(); 
al.Add(array1); 
al.Add(array2); 
al.Add(array3); 

這也許是你最好的選擇,否則你將運行導入ArrayIndexOutOfBound風格的問題。你可能會遇到這種情況

+1

N.B.儘管如此,這不會給出海報想要的訂單。 – 2010-04-21 10:36:48

0

對於這樣的任務,我可能會推出自己的。我將創建一個新的String[],其大小爲a.length + b.length + c.length,然後使用老式的for循環,迭代Math.max(a.length, Math.max(b.length, c.length))次。在循環內部,我會從每個元素中添加一個元素,在此之前測試索引以避免出現界限異常。

在其他地方也正確地指出,您需要跟蹤添加到聚合數組中的最後一項的索引。

0

如果我正確理解你,你需要一些函數來合併你的數組,從數組中取1個下一個元素,如果這個數組有下一個元素的話。

你需要創建索引(見例子)的附加陣列跟蹤,當陣列具有或不具有元素合併:

int[] indexes; //should be initialized with 0's 

void int[] mergeArrays(int[] ... arrays) { 
    int totalLength = 0; 
    for (int[] array : arrays) { 
     totalLength += array.length; 
    } 
    int[] result = new int[totalLength]; 

    indexes = new int[arrays.length]; //array of indexes 
    int mergeIndex = 0; 
    while (mergeIndex < totalLength) { 
     for (int j = 0; j < arrays.length; j++) { 
     if (indexes[j] != -1) { 
      changed = true; 
      result[mergeIndex++] = arrays[j][indexes[j]]; 
      indexes[j]++; 
      if (arrays[j].length == indexes[j]) { 
       indexes[j] = -1; 
      } 
     } 
     } 
    } 
    return result; 
} 
0

從你的描述(你需要的所有零元素,然後所有第一等,並在陣列可以是不同的大小),然後爲了一個易於理解的方法(但不是最有效的)我會做以下幾點:

  • 創建一個每個列表包含其中一個陣列的內容數量
  • 創建一個列表來保存最終的結果
  • 通過列表不斷循環,取出第0個元素,並將其添加到你的結果,直到沒有列出了包含任何更多的元素

可避免產生列表和更有效率的事情,只需要一個索引數組來告訴你每個數組中有哪些元素,但轉換爲列表可能會使問題更容易概念化。

-1
String[] arr0 = ["a1", "a2"]; 
    String[] arr1 = ["b1", "b2", "b3", "b4"]; 
    String[] arr2 = ["c1"]; 
    int length = arr0.length + arr1.length + arr2.length; 
    int max = Math.max(arr0.length, Math.max(arr1.length, arr2.length)); 
    int index = 0; 
    String[] result = new String[length]; 
    for (int i=0; i<max; i++){ 
     if (i<arr0.length) 
      result[index++] = arr0[i]; 
     if (i<arr1.length) 
      result[index++] = arr1[i]; 
     if (i<arr2.length) 
      result[index++] = arr2[i]; 
    } 
+0

這顯然是錯誤的。您必須有一個輔助變量指向您正在寫入結果的索引。 – 2010-04-21 10:43:32

+0

@Petar,謝謝修復它。 – 2010-04-21 11:07:10

1
String[] answer = new String[a.length + b.length + c.length]; 
int maxLength = Math.max(a.length, Math.max(b.length, c.length)); 

int counter = 0;  
for (int i = 0; i < maxLength; i++) 
{ 
    if (i < a.length) 
     answer[counter++] = a[i]; 

    if (i < b.length) 
     answer[counter++] = b[i]; 

    if (i < c.length) 
     answer[counter++] = c[i]; 
} 
+0

我不是一個聲望獵人,但爲什麼在我看來,正確的代碼是向下投票?至少,留下評論,讓我知道我做錯了什麼。 – 2010-04-21 10:57:56

+1

+1:實際上,這是我在這一系列高科技解答中看到的最實際的解決方案。 – xtofl 2010-04-21 11:40:22

-1

上述所有問題的答案是可怕的,可以在3所陳述,如果一個重用System.arraycopy建立大的陣列,足以實現保存兩個陣列中的所有元素。之後,使用Array.sort方法對傳入比較器的大數組進行排序。如果已經存在完美的泡泡/合併排序,則無需編寫自己的泡泡/合併排序。

+0

雖然我同意醜陋的想法,但分揀並沒有幫助,因爲你提到的比較器會變得醜陋。這僅僅是一個'拉鍊',需要...... – xtofl 2010-04-21 11:12:43

+0

說實話,我認爲你的命題方式比Maurice Perry發佈的一般解決方案更醜陋。 – 2010-04-21 11:16:54

+0

對不起,我衝我回答:) – 2010-04-21 11:26:20