2016-11-05 60 views
-2

我有兩個陣列(未的ArrayList):爪哇/更換以簡單的數組元素與while循環

A: [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 0, 0, 0, 0, 0]; 
B: [50, 100, 150, 200, 250]; 

我需要創建一個while循環插入從數組B中的值,以陣列A. 例如,如果位置/指數K = 5,那麼結果應該是:

A: [0, 5, 10, 15, 20, 25, 50, 100, 150, 200, 250, 30, 35, 40, 45]; 

使得B []的內容得到插入就地成A [],在索引K。這會將現有內容推向右側,並刪除超出數組邊界的任何內容。

然後我需要使用一個do while循環打印出新的A值。

我需要做所有使用2個循環:1 while loop代替和do While循環打印。即使沒有必要,這些都是給我的條件。

在我的問題的背景下,全部在分配中提到的是:陣列B的在數組A根據具有索引K.

對不起,如果我的元件 巢所有元素我不清楚,5天前我開始學習編程,我不太瞭解應該提及的細節,也許我寫到現在的代碼可以幫助提供更多的上下文(第一個while循環是我嘗試做我在這個線程中要求的):

import java.util.Arrays; 
import java.util.Random; 
import java.util.Scanner; 

public class Rainers { 

    public static void main(String[] args) { 

     int A[] = new int[15]; 
     int B[] = new int[5]; 
     for (int i = 10; i < A.length; i++) { 
      A[i] = 0; 
     } 
     int K; 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Name Lastname ID1 ID2"); 
     System.out.print("K="); 

     if (sc.hasNextInt()) 
      K = sc.nextInt(); 
     else { 
      System.out.println("input-output error"); 
      sc.close(); 
      return; 
     } 
     sc.close(); 

     if (K >= 0 && K <= 9) { 
      for (int k = 0; k <= 9; ++k) { 

       A[k] = k * K; 
      } 
      for (int k = 0; k <= 4; ++k) { 

       B[k] = 10 * (k + 1) * K; 

      } 
     } 
     else if (K < 0 || K > 9) { 
      K = 5; 
      Random diapazons = new Random(); 
      for (int c = 0; c < 10; ++c) { 
       A[c] = diapazons.nextInt(50); 
      } 
      for (int c = 0; c < 5; ++c) { 
       B[c] = diapazons.nextInt(100 - 50 + 1) + 50; 
      } 
     } 
     sc.close(); 
     System.out.println("A: " + Arrays.toString(A)); 
     System.out.println("B: " + Arrays.toString(B)); 

     int count = K; 

     while (count > K && count <= A.length) { 
      int x = 0; 
      x++; 
      A[K] = B[x]; 
      count++; 

     } 

     System.out.println("A: " + Arrays.toString(A)); 
    } 
} 

預先感謝您的時間,我真的很感激。

+2

你需要很多。但首先,你到目前爲止嘗試過什麼? – pzaenger

+1

你的問題不清楚。 –

+0

我不知道如何將B中的值添加到A產生該結果。我也不知道K是什麼,它扮演着什麼角色。你應該首先試着向你自己(和我們)解釋你應該做什麼,以一種明確的方式。 –

回答

-2

我根據輸出修改了代碼。

// while (count > K && count <= A.length) { 
    // int x = 0; 
    // x++; 
    // A[K] = B[x]; 
    // count++; 
    // 
    // } 

更改爲新的代碼

System.arraycopy(A, K, A, K + B.length, B.length); 
    System.arraycopy(B, 0, A, K, B.length); 
+0

這與提問者的指示衝突。 – user1803551

0

我也是一個在堆棧noobie溢出。 首先我建議你使用ArrayList,因爲學習後它們更靈活。 這不是一個乾淨或優化的代碼,但是, 嘗試將下面的算法添加到您的代碼中。 我是一個努力活躍,學習和參與堆棧溢出的noobie。這段代碼可能有錯誤的錯誤。但是我希望我能幫助解釋這個概念的方法。

void mergep(ArrayList<Integer> a[], ArrayList<Integer> b[], ArrayList<Integer> c) 
{ 
    int acursor = c; 
    int bcursor = 0; 
    while(acursor<= b.length()) 
    { 
    int shiftcursor = b.length()-1; 
    while(shiftcursor>acursor) 
    { 
     a[shiftcursor+1] = a[shiftcursor]; 
     shiftcursor--;//This shifts all the existing entries to the right 
    } 
    a[acursor] = b[bcursor]; 
    bcursor++; 
    acursor++; 
    } 

}

+0

不幸的是,我不能在這個分配中使用ArrayLists。 但是,無論如何謝謝你! – Reinis

+0

是專門提到要合併數組還是僅根據需要打印輸出。 – CodeRider

+0

合併然後打印。 – Reinis

0

您的代碼

int count = K; 

while (count > K && count <= A.length) { 
    int x = 0; 
    x++; 
    A[K] = B[x]; 
    count++; 
} 

有幾個問題:

  • 它什麼都不做,因爲你設置count = K然後給條件count > K
  • 條件count <= A.length將導致AIOOBE,因爲最後一個元素位於A.length - 1
  • 您想要從頭開始訪問B,但您在第一次訪問它之前增加了它的值。
  • 由於您也在迭代B,所以您將需要在循環中停止條件,以避免嘗試訪問大於它的索引。
  • 您正在將B的值存入A,但與此同時,您將丟失A中的值,因爲它們被覆蓋。在覆蓋它之前,您需要將該值存儲在正確的位置。

一旦你修復這些錯誤,你將解決你的問題。你可以編輯你的問題,試圖解決這些問題。

0

必須先移動A中的元素,才能插入B的元素。首先移動數組後面的所有值,以避免丟失任何元素。

1. [5, 10, 15] 
2. [5, 10, 15] 15 
3. [5, 10, 10] 15 
4. [5, 5, 10] 15 
5. [2, 5, 10] 15 

所述元件15將來自陣列被丟棄,但圖5和10將仍然被保持在陣列中:移動元件,當一個步驟以將右元素的移應如下所示。 5的舊位置可以被分配一個新的值,例如, 2.

從數組的最後一個索引迭代並移動元素,以便B的元素可以適合。但不是像上面那樣的一步,移動元素的長度爲B。當到達索引K時停止迭代,因爲將不會插入或移動更多元素。下面的java代碼移動數組A的元素並從B分配值。第一條if語句避免索引出界。第二個if語句檢查B中的元素是否應插入到A中。

int idxA = A.length - 1; 
int idxB = B.length - 1; 
while(idxA >= K){ 
    if (idxA + B.length < A.length) 
     A[idxA + B.length] = A[idxA]; 

    if (idxA < B.length + K){ 
     A[idxA] = B[idxB]; 
     idxB--; 
    } 

    idxA--; 
} 

如果您不確定代碼是如何工作的,使用筆和紙在代碼中的每一個步驟編寫每個陣列的當前狀態。