Векторы внутри вектора - PullRequest
0 голосов
/ 20 октября 2011

У меня есть этот код ... он делает примерно то, что мне нужно. Он ищет в предопределенном массиве целых чисел два целых числа, которые суммируют до целевого целого. Однако, помещая значения в вектор, а не помещая их в ячейки, он размещает все значения вместе. то есть для массива int [50,40,30,20,10] и цели 50 вместо возврата [[50] [40,10] [30,20] ... и т. д.] он печатает [[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;
}

Ответы [ 5 ]

3 голосов
/ 20 октября 2011

Вы добавляете только один вектор к 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]);

Наконец, рассмотрите возможность преобразования inner и outer в локальные переменные.

0 голосов
/ 20 октября 2011

Ответ Deepa находится на полпути, но вам также необходимо создать новый экземпляр inner внутри цикла for, прежде чем добавлять к нему значения;в противном случае вы получите все значения внутри одного inner.Как это:

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

Вы также можете continue после добавления, чтобы немного повысить производительность.

0 голосов
/ 20 октября 2011

Кроме того, вы собираетесь иметь вектор векторов?потому что в данный момент у вас есть вектор с одним вектором с именем inner, поэтому все добавляется прямо во inner.Вы не создаете новый вектор каждый раз, чтобы вставить каждую пару.

0 голосов
/ 20 октября 2011

Переместите эти две строки:

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

во внешний цикл (с индексной переменной k.)

0 голосов
/ 20 октября 2011

Я думаю, что ваша ошибка заключается в том, что сначала добавляется значение вектора во внешнем, так что оно возвращает все значения из внешнего вектора, но не во внутреннем векторе ... необходимо добавить после проверки условия

    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)
...