2011-10-20 2 views
0

나는이 코드를 가지고 ... 내가 필요한 바로 그 것이다. 미리 정의 된 int 배열을 대상 int로 합친 두 개의 int를 검색합니다. 그러나 셀에 값을 배치하는 대신 벡터에 값을 넣을 때 모든 값을 함께 배치합니다. [50] [40,10] [30,20] ... 등을 반환하는 대신 int 배열 [5040302010]과 타겟 50에 대해 [[50, 40,10,30,20 ... 등]] 어떻게 해결할 수 있습니까?벡터 내의 벡터

public Vector<Vector<Integer>> subsetSum(int[] array, int target) { 
    //creates vectors, adds inner vector to another vector 
    outer = new Vector<Vector<Integer>>(); 
    inner = new Vector<Integer>(); 
    outer.add(inner); 

    for (int k = 0; k < array.length; k++) { 
     for (int l = 1; l < array.length; l++) { 
      int sum = array[k]+array[l]; //sum of l and k 
      if (sum == target) { 
       //add l,k to vector 
       inner.add(array[l]); 
       inner.add(array[k]); 
       //prints l and k if their sum equals target 
       System.out.println(array[l]+"+"+array[k]+"="+target); 
      } 
      else { 
       System.out.print(""); 
      } 
     } 
     //if k is the target, display 
     if (array[k] == target) { 
      //add k to vector 
      inner.add(array[k]); 
      //prints if int equals target 
      System.out.println(array[k]+"="+target); 
     } 
    } 
    //return combinations that add up to target in vector form 
    return outer; 
} 

답변

3

outer에 단일 벡터 만 추가 할 수 있습니다. 필요한 합계가 합쳐진 쌍을 발견하면 별개의 벡터에 넣기를 원합니다. 따라서 새로운 "내부"벡터를 생성해야합니다.이 벡터를 outer에 추가해야합니다.

제거 이러한 라인 :

inner = new Vector<Integer>(); 
outer.add(inner); 

변경 :

if (sum == target) { 
    inner = new Vector<Integer>(); 
    outer.add(inner) 
    //add l,k to vector 
    inner.add(array[l]); 
    inner.add(array[k]); 

그리고 :

if (array[k] == target) { 
    inner = new Vector<Integer>(); 
    outer.add(inner) 
    //add k to vector 
    inner.add(array[k]); 

마지막으로, 지역 변수로 innerouter을 고려한다.

+0

오래된 벡터 인'Vector' 대신'List' (선언 된 타입)과'ArrayList' (생성 된 객체)를 사용할 수도 있습니다. 'inner'와'outer' 지역 변수를 만들었다면, 전체 함수도'static'으로 만들 수 있습니다. – msandiford

+0

고마워요! 문제가 해결되었습니다. 후속 질문 (보너스 포인트?) : 위의 5040302010의 예와 마찬가지로 프로그램은 [10,40] 외에도 [40,10]을 보여줍니다. 어떻게 이걸 고칠 수 있겠 어? 감사. –

+0

'1'보다는'k + 1'에'l'을 초기화하십시오. – davmac

0

나는 당신의 실수 조건

if (array[k] == target) { 
     //add k to vector 
     inner.add(array[k]); 
     //prints if int equals target 
     System.out.println(array[k]+"="+target); 
    } 
    outer.add(inner) 
0
를 확인 후 추가해야 .. 내부 벡터에 첫 외부 벡터로부터 반환하여 모든 값에 외부에서 추가 벡터 값뿐만 아니라 거짓말을 생각한다 이들 두 줄 이동

(. 인덱스 변수 k 가진 것), 외부 루프에

inner = new Vector<Integer>(); 
outer.add(inner); 

+0

이렇게하면 빈 "내부"벡터가 외부 벡터에 추가됩니다. – davmac

0

또한 벡터 벡터를 사용하려고합니까? 왜냐하면 순간에, 당신은 내부 벡터라는 하나의 벡터를 가진 벡터를 가지고 있기 때문에, 모든 것이 곧바로 내부에 추가됩니다. 각 쌍을 넣을 때마다 새 벡터를 만들지는 않습니다.

0

디파인의 대답은 반값이지만, inner의 새 인스턴스를 for 루프 내에 만들어야 값을 추가 할 수 있습니다. ; 그렇지 않으면 inner 안에있는 모든 값으로 끝납니다. 이 같은 :

final Vector<Integer> inner = new Vector<Integer>(); 
outer.add(inner); 

당신은 성능을 약간 개선하기 위해 추가 한 후도 continue 수 있습니다.