2010-04-21 3 views
6

나는 예를 들어, 일부 문자열 [] 배열을 가지고 : 나는, C, B, 그런 다음의 A, B, C의 1 개 요소를 ['a1', 'b1', 'c1', 'a2', 'b2', 'b3', 'b4'] (0 요소를 얻을 수 있도록Java에서 두 개의 배열을 혼합하는 방법은 무엇입니까?

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

내가 그들을 혼합 할 수있는 방법 등등)? 감사

보다 정확하게 결과 배열은 첫 번째 배열의 첫 번째 값, 두 번째 배열의 첫 번째 값, ..., 마지막 배열의 첫 번째 값, 첫 번째 배열의 두 번째 값, ..., 마지막 배열의 두 번째 값, ..., 가장 큰 배열의 마지막 값. 배열의 크기가 같지 않으면 작은 배열 만 고려되지 않습니다. 여기

는 그림이다 : 나는, 배열 변수 수를 결합하고 싶습니다, 또한

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

답변

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 for varargs ... 이제는 일반적인 방법, T [] merge (T [] ... 배열)을 만들고 우리는 말하고 있습니다.) 잘 했음 – basszero

+0

@basszero : 예, 좋습니다. –

+0

@ basszero : 사소한 문제 : generic 형식의 배열을 만들 수 없습니다. –

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

ArrayIndexOutOfBound 스타일의 문제. 아마 이런 식으로도 달릴테니까

+1

N.B. 그래도 포스터가 원하는 순서는 아닙니다. –

0

그런 일을 위해서 나는 아마 내 자신을 굴릴 것이다. a.length + b.length + c.length 크기의 새 String[]을 만든 다음 구식 for 루프를 사용하여 Math.max(a.length, Math.max(b.length, c.length)) 회 반복합니다. 루프 내에서 각 요소를 추가하여 경계 예외를 피하기 위해 길이에 대해 인덱스를 테스트합니다.

또한 집계 배열에 추가 된 마지막 항목의 인덱스를 추적해야한다는 점도 올바르게 지적되었습니다.

0

올바르게 이해한다면 배열에 다음 요소가 있으면 각 배열의 다음 요소를 취하여 배열을 병합하는 몇 가지 기능이 필요합니다.

당신은 배열이 있거나 병합 할 요소가없는 경우 추적하는 인덱스 (예제 참조)의 추가 배열을 만들어야합니다 : 당신은 모든 0 번째 필요

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

당신의 설명에서을 (요소는 모든 1, 등등, 그리고 배열에 대해 다음) 다른 크기 될 수있는 이해하기 쉬운 다음 작업을 수행 할 것입니다)하지만 가장 효율적이지 (방법 :

  • 이를 만들 배열 중 하나의 내용을 포함하는 목록의 수
  • 목록 중 어느 것도 더 이상 요소를 포함하지 않을 때까지, 최종 결과에게 목록을 통해
  • 지속적으로주기, 0 번째 요소를 제거하고 결과 목록에 추가를 유지하기 위해 목록을 만들

당신은 생성 방지 할 수 있습니다 각 배열에서 어떤 요소를 사용했는지 알려주는 인덱스 배열을 가지고 목록을 작성하고 작업을 효율적으로 수행 할 수 있지만 List로 변환하면 문제를 개념화하기가 더 쉬워 질 수 있습니다.

-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

이것은 잘못되었습니다. 현재 결과로 작성중인 색인을 가리키는 보조 변수가 있어야합니다. –

+0

@ 페타, 고마워. –

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

나는 평판 사냥꾼이 아니지만, 왜 내 의견으로는 정확한 표식을 얻지 못했을까요? 적어도 내가 뭘 잘못했는지 알 수 있도록 코멘트를 남겨주세요. –

+1

+1 : 사실,이 기술은이 하이테크 해답에서 볼 수있는 가장 현저한 해결책입니다. – xtofl

-1

모든 답변은 끔찍 하나가 충분히 큰 배열을 구축 할 System.arraycopy에 재사용하는 경우 3 문에서 얻을 수있다 두 배열의 모든 요소를 ​​보유하십시오. 그런 다음 Array.sort 메서드를 사용하여 Comparator에서 전달되는이 큰 배열을 정렬합니다. 완벽하게 좋은 벌브가 존재할 때 자신의 버블/병합 정렬을 작성할 필요가 없습니다.

+0

비록 당신이 참조하는 Comparator가 끔찍 해지기 때문에, 필자는 uglyness Idea에 동의하지만 정렬은 도움이되지 않습니다. 그것은 단순한 '우편'입니다. – xtofl

+0

솔직히 말해서, 저는 모리스 페리 (Maurice Perry)가 게시 한 일반적인 해결책보다 귀하의 제안 방법이 못생긴다고 생각합니다. –

+0

예 미안 해요 내 대답을 돌진 :) –

관련 문제