2012-01-22 3 views
2

Я хотел бы создать динамическую Многомерную ArrayList, который считывает из текстового файла с целыми числами, разделенных пробелами и линии, которые ищут что-то вроде этого:Как заполнить многомерный массив ArrayList (Java) из текстового файла?

0 -5 5 0 -3 0 5 
3 1 0 0 0 0 5 
5 -5 0 5 5 1 1 

(лишь малая части фактических данных, и строк и столбцы могут быть изменены, следовательно, необходимость динамического 2D ArrayList)

до сих пор это то, что я имею в коде:.

ArrayList<ArrayList<Integer>> ratings2DArray = new ArrayList<ArrayList<Integer>>(); 
try { 
in = new BufferedReader(new FileReader("PureRatings.txt")); 
     int counter = 0; 

     while (in.readLine() != null) { 
      ratings2DArray.add(new ArrayList<Integer>()); //Adds 2nd dimension. 

^Довольно много говорят, что для каждой строки в текстовом файле , Добавить строка в 2D ArrayList.

Внизу здесь мне нужно объявить переменную string (или char?), Называемую рейтингом, которая берет ввод из текстового файла. И пусть это будет ограничено пробелами (извините, если я не правильно использую терминологию), чтобы каждый символ «-5», «- 3», «0», «3», «5» помещался внутри ArrayList индивидуально ,

  ratings2DArray.get(counter).add(Integer.parseInt(rating)); 
      counter ++; 
     } 

     in.close(); 

    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 

Это едва мой второй семестр с любым воздействием программирования, поэтому любые ответы/советы о том, является ли это осуществимо, эффективный, неэффективный, если я должен использовать различные структуры данных и так далее, будет очень оценили.

ответ

2

Вы направляетесь в правильном направлении. Не забудьте всегда организовывать свой код в логических единицах, это помогает в процессе концептуализации и в обслуживании вашей программы.

public List<List<Integer>> parseRatingsFile(String fileName) throws IOException { 
    List<List<Integer>> ratings2DArray = new ArrayList<List<Integer>>(16); 

    final BufferedReader in = new BufferedReader(new FileReader(fileName)); 
    String ratingsLine = null; 
    while ((ratingsLine = in.readLine()) != null) { 
     ratings2DArray.add(parseRatingsLine(ratingsLine)); 
    } 
    in.close(); 

    return ratings2DArray; 
} 

public List<Integer> parseRatingsLine(String ratingsLine) IOException { 
    List<Integer> ratings = new ArrayList<Integer>(8); 
    if(ratingsLine == null) return ratings; 

    String[] ratingsStrArr = ratingsLine.split(" "); // Tokenize on 'space' character 
    for(final String ratingStr: ratingsStrArr) { 
     // Here you would parse the ratingStr as an Integer, and 
     // add it to your list 
    } 

    return ratings; 
} 

Вы должны обрабатывать NumberFormatExceptions, которые могут возникнуть при анализе отдельных целых чисел. Вы заметите, что я сбросил переменную counter, что делает вашу программу более сложной и может быть источником ошибок. Удачи с остальной частью домашней работы.

+0

Ничего себе, это большая помощь. Благодарю. Не возражаете, если я задам вам несколько вопросов об этом, чтобы больше понять код? – Marcos

+0

Конечно, что вам нужно для понимания? – Perception

+0

Что означают 16 и 8, когда внутри метода ArrayList? "Список <Список > Рейтинги2DArray = новый ArrayList <Список > (16);" Кроме того, я правильно понял, что цикл while добавляет строки после того, как столбцы были индивидуально созданы в методе parseRatingsLine? – Marcos

2
  • Это выполнимо с подходом вы follwing
  • С точки зрения проектирования структуры данных, попробуйте использовать List interface как:

    List<List<Integer>> ratings2DArray = new ArrayList<ArrayList<Integer>>();

    Причина этого заключается в том, что теперь завтра вас может изменить ArrayList на что-то другое.

  • Что касается эффективности, то ваш soln достаточно эффективен в отношении характера вашей потребности. Если кто-то действительно должен выжать больше производительности, тогда код может быть не таким читаемым. Один сон, который я думаю (на вершине моей головы), исходя из предположения, что нет. столбцов const для всего файла, состоит в том, чтобы избавиться от второго/вложенного ArrayList и заменить его на фиксированный размер массива int.

    Чтобы определить количество столбцов, мы можем использовать первую строку в файле в качестве ссылки.


Разработка по оптимизации SOLN на основе ниже комментарий.

Так что вы говорите, колонка представляет книгу (каждый столбец является другой книгой) и строки представляют клиент (каждая строка является другим клиентом) ...

Say Я выбираю -100 в качестве значения для безрейтинговых книг (есть лишние пробелы в данных только для ясности)

  Book1 Book2 Book3 Book4 
Customer1 -100 5  5  3 
Customer2 0 3  2 -100 

Теперь, когда я читаю файл число столбцов фиксированы для данного файла, который можно определить с первой строки.

Скажите книгу 'Book5`.

  Book1 Book2 Book3 Book4 Book5 
Customer1 -100 5  5  3 -100 
Customer2 0 3  2 -100 -100 

Произнести Заказчик Заказчик3.

  Book1 Book2 Book3 Book4 
Customer1 -100 5  5  3 
Customer2 0 3  2 -100 
Customer3 -100 -100 -100 -100 

Так что в обоих случаях чтение первой строки говорит нам нет. столбцов, и они остаются const для файла.


Теперь, если хотите что-то добавить к памяти List то выше SOLN не очень оптимизирован. Поскольку каждое обновление должно будет изменить размер массива. Оптимизация обычно применяется для конкретных случаев использования.

Итак, для добавления данных в память я думаю, что ваш текущий soln будет преуспевать. Только вы можете сделать, это, чтобы передать не из столбцов ArrayList создания как:

// We are telling ArrayList the expected data size 
// You can choose noOfColumns + some value according to ur need 
// It will expand if more is needed 
ratings2DArray.add(new ArrayList<Integer>(noOfColumns)); 

при загрузке файла. Таким образом, ArrayList является лаконичным и будет лучше работать.

+0

Я не думаю, что я мог бы иметь строки или столбцы как фиксированную сумму. Я работаю над проектом оценки книги, и каждая строка (строка) представляет рейтинги, данные клиентом, а столбцы - рейтинги для любой данной книги. Поскольку я должен иметь возможность бесплатно добавлять клиентов и книги, лучшим решением, о котором я мог думать, было бы использование полностью динамического 2D ArrayList. Спасибо хоть. – Marcos

+0

@Marcos добавил еще несколько комментариев относительно вашего комментария. – havexz

+0

Спасибо, да, я сделал отдельный массив для названий книг и, вероятно, создаст переменную int, используя метод size этого массиваList, чтобы передать количество столбцов в этот массивList. – Marcos

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