整数数组列表改为java

时间:2016-01-31 16:01:24

标签: java arrays arraylist

我使用整数数组列表来保存答案,这是一个类变量。整数数组被添加到方法的列表中,结果很好(有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]

这里出了什么问题?

4 个答案:

答案 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中,参数按值传递。 这意味着,您可以更改组合函数内部的值,但这绝不会反映回调用主函数 - 这是按值调用的性质。