Векторы внутри вектора

#java #arrays #vector #multidimensional-array #subset-sum

#java #массивы #вектор #многомерный массив #подмножество-сумма

Вопрос:

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

Ответ №1:

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

Комментарии:

1. Можно также рассмотреть возможность использования List (объявленных типов) и ArrayList (сконструированных объектов) вместо старой школы Vector . Если вы создали inner и outer локальные переменные, то можно было бы создать static и всю функцию.

2. Спасибо! Исправлена проблема. Последующий вопрос (бонусные баллы?): Для того же примера 50,40,30,20,10, приведенного выше, программа показывает [40,10] в дополнение к [10,40]. Любая подсказка, как я мог бы это исправить? Спасибо.

3. Инициализируйте l k 1 вместо 1 .

Ответ №2:

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

     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)
  

Ответ №3:

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

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

во внешний цикл (тот, у которого есть переменная index k .)

Комментарии:

1. Это приведет к добавлению большого количества пустых «внутренних» векторов к внешнему вектору.

Ответ №4:

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

Ответ №5:

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

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

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