【问题标题】:ArrayList value changed to last element when accessing outside the loop in which values are added在添加值的循环外部访问时,ArrayList 值更改为最后一个元素
【发布时间】:2019-08-31 19:40:52
【问题描述】:

实际上我想将所有不同的子集存储在res ArrayList 中。我不想更改列表的数据类型,因为它是其他一些方法所必需的。我得到的问题是,如果在添加值的循环之外访问 res 的值会发生变化。更改的值是列表中的最后一个值,它被复制到每个位置或其他东西。谁能解决这个错误?

我还使用setlength() 来重置字符串的值而不是删除。 当我在将值输入列表后(res.add(counter) 之后)最后使用 delete 时,所有值都变为空,当我将 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;
 }

【问题讨论】:

  • 确保遵循 Java 命名约定:变量名以驼峰命名。 set_size 应该是 setSize
  • 为什么你在使用StringBuilder 并且还在进行字符串连接sb + "-"?为什么要第二个建造者sb

标签: java arraylist powerset


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多