Создать ArrayList из ArrayList <Integer> - PullRequest
4 голосов
/ 03 февраля 2012

Я пытаюсь использовать приведенный ниже код для создания многомерного ArrayList. Мой код просто наполняет внутренний ArrayList (localSolutions), но когда я пытаюсь добавить этот ArrayList во внешний ArrayList (решения), что-то идет не так, и вместо этого он добавляет пустые ArrayLists.

public class MathCapstone {

public static void main(String[] args) {
    ArrayList<ArrayList<Integer>> list = entireList(10);

    for(int q = 0;q<list.size();q++) {
        System.out.println(list.get(q));
    }

public static ArrayList<ArrayList<Integer>> entireList(int max) {
    ArrayList<ArrayList<Integer>> solutions = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> localSolutions = new ArrayList<Integer>();

    for(int i = 1; i <= max; i++) {
        for(int j = 1; j < i; j++) {
           //System.out.println(j + "mod" + i + "=" + (j*j)%i);
            if ((j*j)%i == 1) {
                localSolutions.add(j);
            }
        }
        //System.out.println(localSolutions.toString());
        solutions.add(localSolutions);
        localSolutions.clear();
    }
    return solutions;
}

И последнее замечание: было бы лучше использовать HashMap из ArrayLists (в конце концов я собираюсь создать CDF для максимальных значений до 10k)?

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Вы делаете:

localSolutions.clear();

Добавление списка в другой список не добавляет копию списка, он добавляет тот же объект списка. То, что делает ваш код во externalloop, - это заполнение того же списка элементами, его очистка и добавление в solutions. solutions содержит max ссылок на тот же пустой список.

То, что вы хотите сделать, это:

ArrayList<ArrayList<Integer>> solutions = new ArrayList<ArrayList<Integer>>();
for(int i = 1; i <= max; i++) {
    ArrayList<Integer> localSolutions = new ArrayList<Integer>();
    for(int j = 1; j < i; j++) {
       //System.out.println(j + "mod" + i + "=" + (j*j)%i);
        if ((j*j)%i == 1) {
            localSolutions.add(j);
        }
    }
    //System.out.println(localSolutions.toString());
    solutions.add(localSolutions);
}
3 голосов
/ 03 февраля 2012

Вы очищаете список localSolutions * 1002. *.

В Java вы копируете по значению только ссылку на объект, а не сам фактический объект.Поэтому, когда вы добавляете список localSolutions в список solutions , и ссылка localSolutions , и первая запись списка solutions , указываютк тому же объекту.

Таким образом, когда вы очищаете список localSolutions , вы фактически очищаете первую запись в вашем списке solutions .

...