2016-05-06 3 views
0

Я хочу создать ArrayList-матрицу с п-строк и М-столбцов, напримерСоздание матрицы с ArrayLists

1 2 3 4 5 

    1 2 3 4 5 

    1 2 3 4 5 

    1 2 3 4 5 

    1 2 3 4 5 

Я уже написал код для создания такой матрицы, но мой код Безразлично 't отображать значения, когда я очищаю список, содержащий данные столбца. Вот мой

package testproject; 

import java.util.ArrayList; 

public class TestProject { 

    public static void main(String[] args) { 
     ArrayList<Integer> intList = new ArrayList<>(); 
     ArrayList<ArrayList<Integer>> mainList = new ArrayList<>(); 
     for (int i = 0; i < 10; i++) { 
      for (int k = 0; k < 5; k++) { 
       intList.add(k); 
      } 
      mainList.add(intList); 
      intList.clear(); //this line is probably the problem 
     } 
     for (int row = 0; row < mainList.size(); row++) { 
      for (int col = 0; col < mainList.get(0).size(); col++) { 
       System.out.print(mainList.get(row).get(col) + ","); 
      } 
      System.out.println(""); 
     } 
    } 
} 

есть ли возможность, чтобы очистить содержимое IntList без очистки содержимого mainList ??

+0

Не могли бы вы просто объявить новый ArrayList newList = new ArrayList (intList); Затем добавьте это в mainList вместо intList? – Orin

ответ

1

При вызове mainList.add(intList); вы добавляете ссылку, ведущую к объекту IntList в ваш mainList вместо копирования значений. Вам нужно будет создать один экземпляр «intList» для каждой строки и ничего не понять.

+0

sandBo00 Я вижу ... создание одного экземпляра для каждой строки, вероятно, приведет к снижению производительности при более высоких количествах строк (> = 100000). – Ramses

+0

@Ramses Я только что протестировал с 120000 строк и по 10 столбцов каждый, каждая позиция заполнена случайным целым числом, и это заняло у меня незанятое время ;-) – sandbo00

0

Я бы создал n- или m-ArrayLists, это зависит от того, как вы хотите его использовать.

Или вы создаете один hashmap> для каждой строки один ArrayList.

1

Просто нужно переместить создание intList внутри цикла и теперь должно работать.

import java.util.ArrayList; 
     public class TestProject { 
      public static void main(String[] args) { 
       ArrayList<ArrayList<Integer>> mainList = new ArrayList<>(); 
       for(int i=0;i<10;i++) { 
        ArrayList<Integer> intList = new ArrayList<>(); 
        for(int k=0;k<5;k++) { 
         intList.add(k); 
        } 
        mainList.add(intList); 
       } 
       for(int row=0;row<mainList.size();row++) { 
        for(int col=0;col<mainList.get(0).size();col++) { 
         System.out.print(mainList.get(row).get(col)+","); 
        } 
        System.out.println(""); 
       } 
      } 
     } 
+1

Вы должны удалить строку 'intList.clear();', иначе списки все равно будут пустыми. – sandbo00

+0

@Maxqueue ваше решение работает только при удалении строки intList.clear() :-) – Ramses

+1

Да пропустил это. – Maxqueue

1

Да, ваша догадка верна. проблема intList.clear();. Поскольку intList хранится в mainList, и если вы очистите intList, информация в mainList также будет потеряна. one: new intList в каждом цикле Но поскольку матрицы обычно не являются переменными по своим размерам, которые являются Arraylists - вы должны рассмотреть возможность использования int[][] intList для ваших матриц.

1

Java работает со ссылками. Поэтому в вашей программе mainList будет содержать 5 ссылок на тот же уникальный номер intList. Все, что вы делаете, чтобы intList будет отражать во всех «строк» ​​в mainList, очистка, изменение значения и т.д.

Если вы хотите, чтобы создать матрицу, вы, скорее всего, нужно, чтобы каждый «строки» будет ссылка на другой список. Это может быть сделано путем инстанцировании новый список в цикле:

package testproject; 

import java.util.ArrayList; 

public class TestProject { 

    public static void main(String[] args) { 
     ArrayList<ArrayList<Integer>> mainList = new ArrayList<>(); 
     for (int i = 0; i < 10; i++) { 
      ArrayList<Integer> intList = new ArrayList<>(); // This creates a new list for each row. 
      for (int k = 0; k < 5; k++) { 
       intList.add(k); 
      } 
      mainList.add(intList); 
     } 
     for (int row = 0; row < mainList.size(); row++) { 
      for (int col = 0; col < mainList.get(0).size(); col++) { 
       System.out.print(mainList.get(row).get(col) + ","); 
      } 
      System.out.println(""); 
     } 
    } 
} 

В программе, очищая промежуточный список не является необходимым.