Значение ArrayList изменено на последний элемент при доступе вне цикла, в который добавляются значения - PullRequest
0 голосов
/ 10 апреля 2019

На самом деле я хочу сохранить все отдельные подмножества в res ArrayList. Я не хочу изменять тип данных списка, так как это требуется каким-либо другим методом. Проблема, которую я получаю, заключается в том, что значение res изменяется при доступе вне цикла, в котором оно добавляет значение. Измененное значение является последним значением в списке, которое копируется в каждую позицию или что-либо еще. Кто-нибудь может решить эту ошибку?

Я также использую setlength() для сброса значения строки вместо удаления. Когда я наконец использую delete после ввода значения в список (после res.add(counter)), все значения становятся пустыми, а когда я помещаю delete() сразу после начального цикла for, все значения в списке обновляются до последнего значение элемента.

static List<StringBuilder> printPowerSet(int set[], int set_size) {
    long pow_set_size = (long) Math.pow(2, set_size);
    int counter, j;

    List<StringBuilder> res = new ArrayList<>();

    String temp = new String();
    StringBuilder sbFinal = new StringBuilder();

    for (counter = 0; counter < pow_set_size; counter++) {
        sbFinal.delete(0, sbFinal.length());
        for (j = 0; j < set_size; j++) {
            if ((counter & (1 << j)) > 0) {
                temp = String.valueOf(set[j]);
                StringBuilder sb = new StringBuilder(temp);
                sbFinal.append(sb + "-");
            }
        }

        res.add(counter, sbFinal) ; 
        System.out.println(res.get(counter)); // the value here is displaying fine
    } 
    for (StringBuilder check : res) {
        System.out.println(check); // the values are changed here with last element value
    }
    return res;
 }

1 Ответ

0 голосов
/ 10 апреля 2019

Вы всегда добавляете sbFinal к своему ArrayList, поэтому ваш ArrayList содержит большое количество только этих.

Просто замените на res.add(counter, sb); и переместите его туда, где он был создан.

Кстати: вы действительно должны хранить String вместо StringBuilder.

static List<StringBuilder> printPowerSet(int set[], int set_size) {

    long pow_set_size =   (long) Math.pow(2, set_size); 

    List <StringBuilder> res=new ArrayList<>();

    for(int counter = 0; counter <  pow_set_size; counter++) { 
        for(int j = 0; j < set_size; j++) { 
            if((counter & (1 << j)) > 0) {
                StringBuilder temp = new StringBuilder(String.valueOf(set[j])
                res.add(temp);
            }
        } 

        System.out.println(res.get(counter)); //the value here is displaying fine
     } 
    for(StringBuilder check:res)
    {
        System.out.println(check); // the values are changed here with last element value
    }
    return res;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...