2015-01-09 61 views
0

我有兩個這樣的數組。我想合併這兩個數組使用索引值的組合。在java中動態數組合並

我的輸入將是兩個整數值(2:3比率),這樣

int firstArray = 2; //input value 
int secondArray = 4; //input value 

合併畢竟值將被存儲在單個列表。現在我需要這樣的輸出。

1 
2 
111 
222 
333 
444 
3 
1 
555 
666 
777 
888 
2 
3  
999 
111 
222 
333 

循環應該運行,直到哪個數組長度很大並且從這兩個數組中檢索所有值。

如果數組長度得到了改變,則輸出比也應改變

String[] arr1 = { "1", "2", "3", "4", "5", "6", "7", "8" }; 
String[] arr2 = { "111", "222", "333", "444", "555" }; 

int firstArray = 3; //input value 
int secondArray = 2; //input value 

輸出:

1 
2 
3 
111 
222 
4 
5 
6 
333 
444 
7 
8 
1 
555 
111 

所以條件輸出應包含來自兩個陣列和直到陣列輸出的最大長度的所有值應完成第二個比例(第二個輸入值 - secondArray)。

在此先感謝。

String[] arr = mergeArrays(arr1, arr2, 2, 3); 

     System.out.println("Ratio 2:3"); 

     for (String str : arr) { 
      System.out.println(str); 
     } 

private static String[] mergeArrays(String[] arr1, String[] arr2, int firstArray, int secondArray) { 
     final String[] ret = new String[arr1.length + arr2.length]; 

     for (int j = 0, k = 0; j < arr1.length || k < arr2.length;) { 
      if (j < arr1.length) { 
       do { 
        ret[j + k] = arr1[j]; 
        j++; 
       } while (j < arr1.length && (j % firstArray != 0 || k == arr2.length)); 
      } 
      if (k < arr2.length) { 
       do { 
        ret[j + k] = arr2[k]; 
        k++; 
       } while (k < arr2.length && (k % secondArray != 0 || j == arr1.length)); 
      } 
     } 

     return ret; 
    } 

我從這個solution

試過,但我不能能帶來正確的出放

回答

1

我用List代替陣列,因爲我不認爲你真的可以預測結果數組的長度。

public static <T> List<T> merge(List<T> l1, List<T> l2, int r1, int r2) { 
    List<T> result = new ArrayList<T>(); 

    int index1 = 0; 
    int index2 = 0; 

    while (index1 < l1.size() || index2 < l2.size()) { 
     for (int i = 0; i < r1; ++i) 
      result.add(l1.get((index1 + i) % l1.size())); 
     index1 += r1; 
     if (index2 < l2.size()) { 
      for (int i = 0; i < r2; ++i) 
       result.add(l2.get((index2 + i) % l2.size())); 
      index2 += r2; 
     } 

    } 
    return result; 
} 

測試代碼:

String[] arr1 = { "1", "2", "3" }; 
String[] arr2 = { "111", "222", "333", "444", "555", "666", "777", 
      "888", "999" }; 

System.out.println(merge(Arrays.asList(arr1), Arrays.asList(arr2), 2, 4)); 

輸出:

[1, 2, 111, 222, 333, 444, 3, 1, 555, 666, 777, 888, 2, 3, 999, 111, 222, 333] 
+0

嗨Niels,感謝您的支持。您的輸出幾乎是正確的,但一個邏輯缺少輸出將以秒比(sencondArray)結束。 – Raj

+0

嗨尼爾,刪除後**如果(index2 Raj

3

這應該工作:如果你想生成一個新的數組instaed的

public static void main(String args[]) throws IOException { 
    int[] array1 = {1, 2, 3, 4, 5, 6, 7, 8}; 
    int[] array2 = {11, 22, 33}; 

    int firstArray = 3; 
    int secondArray = 5; 

    for (int a1 = 0, a2 = 0; ;) { 
     for (int i = 0; i < firstArray; i++) 
      System.out.println(array1[a1++ % array1.length]); 
     if (a1 >= array1.length && a2 >= array2.length) 
      break; 
     for (int i = 0; i < secondArray; i++) 
      System.out.println(array2[a2++ % array2.length]); 
     if (a1 >= array1.length && a2 >= array2.length) 
      break; 
    } 
} 

在視頻上打印結果,只需聲明一個ArrayList並使用add()方法向其添加元素:

public static void main(String args[]) throws IOException { 
    int[] array1 = {1, 2, 3, 4, 5, 6, 7, 8}; 
    int[] array2 = {11, 22, 33}; 

    int firstArray = 3; 
    int secondArray = 5; 

    ArrayList<Integer> output = new ArrayList(); 

    for (int a1 = 0, a2 = 0; ;) { 
     for (int i = 0; i < firstArray; i++) 
      output.add(array1[a1++ % array1.length]); 
     if (a1 >= array1.length && a2 >= array2.length) 
      break; 
     for (int i = 0; i < secondArray; i++) 
      output.add(array2[a2++ % array2.length]); 
     if (a1 >= array1.length && a2 >= array2.length) 
      break; 
    } 

    for (int i = 0; i < output.size(); i++) 
     System.out.println(output.get(i)); 
} 

如果你想創建一個函數:

public ArrayList<Integer> merge(int[] array1, int[] array2, int firstArray, int secondArray) { 

    ArrayList<Integer> output = new ArrayList(); 

    for (int a1 = 0, a2 = 0; ;) { 
     for (int i = 0; i < firstArray; i++) 
      output.add(array1[a1++ % array1.length]); 
     if (a1 >= array1.length && a2 >= array2.length) 
      break; 
     for (int i = 0; i < secondArray; i++) 
      output.add(array2[a2++ % array2.length]); 
     if (a1 >= array1.length && a2 >= array2.length) 
      break; 
    } 

    return output; 
} 

如果你不想返回ArrayList,只需將其轉換爲int[]

+0

朱利奧您好,感謝您的支持。您的輸出幾乎正確,但缺少一個邏輯輸出將以第二個比率(sencondArray)結束。 – Raj

+0

我不明白,試着更好地解釋什麼是問題。 –