【发布时间】: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?