2016-03-02 3 views
0

Я просто тестирую метод разбивки на результат SQL, но каждый раз, когда я пытаюсь добавить данные от c до b, b заканчивается пустым, потому что как-то вызывается функция очистки c до ее добавления в b, а затем отправляется обратно основного класса. Я думал, что это была ошибка инициализации, но я ее протестировал и обнаружил, что она связана с c.clear(), поэтому удаление данных позволяет добавить данные до b, но не очистит c для следующих 7 или менее пунктов. Почему эта очистка до или как я могу обеспечить ее до конца не до конца?ArrayList называет clear() раньше времени?

(Уточнение: столбцы каждого результирующего набора сохраняются как ArrayList, представляющие одну строку данных. Затем это обернуто вокруг другого массива, представляющего весь набор результатов, который отправляется сюда, чтобы этот метод разбивается на страницы из 7 строк и отправить обратно в HashMap для последующего извлечения.)

Это просто тест, не ищет совершенства здесь

public static void Index(ArrayList<ArrayList<String>> raw, String user) {  
    ArrayList<ArrayList<ArrayList<String>>> b = new ArrayList<ArrayList<ArrayList<String>>>(); 
    ArrayList<ArrayList<String>> c = new ArrayList<ArrayList<String>>(); 
    int n = 0; 

    for (ArrayList<String> a : raw) { 
     if (n < 6 && a.size() > 1) { 
      c.add(a); 
      n++; 
     } else if (a.size() == 1) { 
      c.add(a); 
      b.add(c); 
      c.clear(); 
     } else { 
      n = 0; 
      b.add(c); 
      c.clear(); 
     } 
    } 

    n = 0; 
    Clarify.results.put(user, b); 
} 

ответ

2

как-то понятно, функция с, называется перед добавлением б

У Java есть только примитивная и эталонная переменная. a и b и c - это просто ссылки на объекты. Когда вы добавляете ссылку на коллекцию и затем изменяете данные, на которые ссылается эта ссылка, вы изменяете одну и только копию этого объекта.

Одним словом, вы не можете добавить объект в список, вы можете добавить ссылку к этому объекту в список.

Вместо вызова c.clear() попробуйте создать новый список вместо очистки старого.

// create a new list instead of altering the one we just added 
c = new ArrayList<>(); 
+0

Или другой способ: 'add()' не копирует значение. – Andreas

+0

Спасибо за объяснение моей ошибки. – Creatorsuperman

+0

@ Аndreas лучше подумать о том, что значение является ссылкой на объект, и в этом случае оно копирует только это. –

Смежные вопросы