Треугольник Паскаля дает только последнюю строку с использованием Java ArrayList

Я пытаюсь создать треугольник Паскаля для строк. Для 5 это дает мне только 5-й ряд пять раз. Не знаю, почему?

public class Solution {
    public ArrayList<ArrayList<Integer>> generate(int a) {

        ArrayList<Integer> internal = new ArrayList<Integer>();
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        for(int i = 0 ; i < a ; i++)
        {
            internal.clear();
            internal.add(1);
            for(int j = 0 ; j < i ; j++ )
            {
                internal.add(internal.get(j) * (i - j)/(j + 1));
            }
            result.add(internal);
        }
        return result;
    }
}

Ожидается:- [1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]
Получение:- [1 ,4,6,4,1],[1,4,6,4,1],[1,4,6,4,1],[1,4,6,4,1],[1,4] ,6,4,1]

Нужна причина, почему это происходит


person david419    schedule 12.04.2016    source источник
comment
Это потому, что вы многократно используете одну и ту же ссылку. Не используйте clear. Вместо этого начните со списка new.   -  person Paul Boddington    schedule 12.04.2016
comment
спасибо сработало!!   -  person david419    schedule 12.04.2016
comment
Каждый раз, когда вы меняете свой внутренний ArrayList, вы меняете весь объект, на который ссылается ваш результат ArrayList. Как сказал Пол, каждый раз создавайте новый ArrayList и добавляйте его к своему результату. internal = new ArrayList<Integer>(); вместо internal.clear();   -  person Nick Suwyn    schedule 12.04.2016
comment
Без проблем. Я рад, что смог помочь!   -  person Paul Boddington    schedule 12.04.2016
comment
@Ник спасибо. понятно !   -  person david419    schedule 12.04.2016


Ответы (1)


import java.util.ArrayList;

public class Solution {
    
    public static void main(String args[]){
        System.out.print(generate(3));
        
    }
    public static ArrayList<ArrayList<Integer>> generate(int a) {

        ArrayList<Integer> internal = new ArrayList<Integer>();
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        for(int i = 0 ; i < a ; i++)
        {
            internal = new ArrayList<Integer>(); //this is the keypoint.
            internal.add(1);
            for(int j = 0 ; j < i ; j++ )
            {
                internal.add(internal.get(j) * (i - j)/(j + 1));
            }
            result.add(internal);
        }
        return result;
    }
}

Вывод

[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]

person Dhanushka Perumbuli    schedule 24.01.2021