Ellen Xu
Ellen Xu

Reputation: 101

list of integer arrays is changed java

I am using a list of integer arrays, which is a class variable, to hold the answers. The integer arrays are added to the list in a method, and the results are fine (has 1s). But when I fetch it in main method, the value in it is all 0s! I do not understand, where is the list changed?

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);
    }
}

} }

The answers looks like this: when print in method combinate, the list elements looks like [1111100000]

while in main method, there are all [000000000000]

what goes wrong here?

Upvotes: 1

Views: 108

Answers (4)

Let&#39;sRefactor
Let&#39;sRefactor

Reputation: 3346

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)));
}

Will Help.

[See Experiment : http://rextester.com/DNNZ68674 ]

Upvotes: 1

Thorsten Laux
Thorsten Laux

Reputation: 100

In the original code you're passing the "holder"-variable as a parameter. In Java parameters are passed by value. This means, you can change the value inside of the combinate-function, but this will never be reflected back to the calling main-function - that's the nature of call by value.

Upvotes: 1

Thomas Kl&#228;ger
Thomas Kl&#228;ger

Reputation: 21435

You have only a single Integer[] instance that you add to your result (res.add(holder)) and overwrite while unwinding the recursion.

You should add a clone of your array to the result:

res.add(holder.clone());

Upvotes: 1

SomeDude
SomeDude

Reputation: 14228

Have your method "combinate" return new res like public static ArrayList<Integer[]> combinate(double[] left, int n, int k,int sum, ArrayList<Integer[]> res, Integer[] holder)

then in your main : res = combinate(...);

Upvotes: 1

Related Questions