2016-11-05 2 views
-2

I 두 배열 (되지 ArrayLists)가 : I가 배열 A. 에 배열 B의 값을 삽입 while 루프를 만들어야자바/while 루프로 간단한 배열의 요소를 교체

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

을 예를 들어, 위치/인덱스 K = 5의 경우, 결과가 같아야 B []의 콘텐츠 인덱스 K에서 A []에 삽입 자리에서 얻을

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

되도록. 이렇게하면 기존 내용을 오른쪽으로 밀어 넣고 배열 경계 외부로 푸시 된 내용을 삭제합니다.

그런 다음 새로운 A 값을 인쇄하려면 do while 루프를 사용해야합니다.

교체를 위해 1 while loop, 인쇄를 위해 do While 루프를 사용하여 모든 작업을 수행해야합니다. 그것이 필요하지 않더라도, 그것들은 나에게 주어진 조건입니다. 할당에서 언급 내 질문의 맥락에서

, 모든입니다 : A I 경우 K.

죄송 인덱스를 가진 요소에 따라 배열의 배열 B의 둥지는 모든 요소 나는 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

출력마다 코드를 수정했습니다. 새로운 코드

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

이것은 묻는 사람의 지시와 상충됩니다. – user1803551

0

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

변경 나 또한 noobie 스택 오버 플로우입니다. 우선 ArrayList를 사용하는 것이 좋습니다. 한 번 배우면 훨씬 융통성이 있기 때문입니다. 깨끗한 코드 또는 최적화 된 코드가 아니지만, 코드에 다음 알고리즘을 추가하십시오. 저는 적극적으로 배우고 스택 오버플로에 참여하려고하는 noobie입니다. 이 코드에는 버그가있을 수 있습니다. 그러나 나는 alogirthm의 접근법을 설명하는데 도움이되기를 희망합니다.

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++; 
    } 

}

int count = K; 

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

몇 가지 문제가

+0

불행히도이 할당에서는 ArrayLists를 사용할 수 없습니다. 하지만 고맙습니다. – Reinis

+0

은 배열을 병합하거나 필요에 따라 출력을 인쇄하기 위해 특별히 언급되었습니다. – CodeRider

+0

병합 한 다음 인쇄하십시오. – Reinis

0

귀하의 코드 : 당신이 count = K을 설정 한 후 조건 count > K을 제공하기 때문에

  • 그것은 아무것도하지 않습니다.
  • 조건 count <= A.length은 마지막 요소가 A.length - 1이기 때문에 AIOOBE를 발생시킵니다.
  • 처음부터 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에 도달하면 반복을 중지합니다. 아래 자바 코드는 배열 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--; 
} 

는 코드의 각 단계에서 각 배열의 현재 상태를 작성하는 펜과 종이를 사용합니다.

관련 문제