我使用整数数组列表来保存答案,这是一个类变量。整数数组被添加到方法的列表中,结果很好(有1)。但是当我在main方法中获取它时,它的值都是0!我不明白,列表在哪里改变了?
public class test {
private static int sum=0;
static ArrayList<Integer[]> res = new ArrayList<Integer[]>();
private static double max=0;
public static void main(String[] args) {
int n = 6;
double B = 23.6;
double[] menu = { 1.2, 2, 2.5, 3.5, 3.2, 6.2, 7.8, 4.0, 5.6, 10, 6.5 };
Integer[] solution = new Integer[menu.length];
combinate(menu, 0, n,0, res, solution);
for(int i=0;i<res.size();i++) {
//not getting the element!!!!!!!!!!!!
//Integer[] sol = res.get(i);
System.out.println(i+" "+res.get(i));
System.out.println("Arraylist contains:"+Arrays.toString( res.get( i ) ) );
double sums = 0.0;
for (int j = 0; j < res.get(i).length; j++) {
if(res.get(i)[j]!=null)
sums += menu[j] * res.get(i)[j];
}
if (max < sums && sums < B) {
max = sums;
}
}
System.out.println(max + " max");
}
public static void combinate(double[] left, int n, int k,int sum,
ArrayList<Integer[]> res, Integer[] holder) {
if (n == left.length) {
if (sum == k) {
res.add(holder);
System.out.println(res.size()+" "+Arrays.toString(res.get(res.size()-1)));
}
sum = 0;
return;
}
{
holder[n] = 1;
sum++;
combinate(left, n + 1, k, sum,res, holder);
holder[n] = 0;
sum--;
combinate(left, n + 1, k, sum,res, holder);
}
}
} }
答案如下: 当在方法组合中打印时,列表元素看起来像[1111100000]
而在main方法中,有[000000000000]
这里出了什么问题?
答案 0 :(得分:1)
有你的方法&#34;组合&#34;返回public static ArrayList<Integer[]> combinate(double[] left, int n, int k,int sum,
ArrayList<Integer[]> res, Integer[] holder)
然后在你的主要:res = combinate(...)
;
答案 1 :(得分:1)
if (sum == k)
{
res.add(holder.clone()); // take copy of holder at that moment
System.out.println(res.size()+" "+Arrays.toString(res.get(res.size()-1)));
}
会帮助。
[请参阅实验:http://rextester.com/DNNZ68674]
答案 2 :(得分:1)
您只有一个Integer []实例添加到结果(res.add(holder)
)并在展开递归时覆盖。
您应该将数组的克隆添加到结果中:
res.add(holder.clone());
答案 3 :(得分:1)
在原始代码中,您将&#34; holder&#34; -variable作为参数传递。在Java中,参数按值传递。 这意味着,您可以更改组合函数内部的值,但这绝不会反映回调用主函数 - 这是按值调用的性质。