在添加值的循环外部访问时,ArrayList的值更改为最后一个元素

时间:2019-04-10 11:03:54

标签: java arraylist powerset

实际上,我想将所有不同的子集存储在0 [nature, car] 1 [view, technology] 2 [feel, great, trees] 3 [excited, concert] 4 [computer, mobile] ArrayList中。我不想更改列表的数据类型,这是其他一些方法所必需的。我得到的问题是,如果在添加值的循环之外进行访问,则res的值会更改。更改后的值是列表中的最后一个值,该值被复制到每个位置或其他位置。谁能解决这个错误?

我还使用res重置字符串的值,而不是删除。 当我在将值输入列表之后(setlength()之后)最后使用delete时,所有值都变为空,而当我将res.add(counter)放在初始for循环之后时,列表中的所有值都将获得更新为最后一个元素值。

delete()

1 个答案:

答案 0 :(得分:0)

您总是将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;
 }