Как заполнить многомерный ArrayList (Java) из текстового файла? - PullRequest
2 голосов
/ 22 января 2012

Я хотел бы создать динамический многомерный ArrayList, который читает из текстового файла с целыми числами, разделенными пробелами, и строками, которые выглядят примерно так:

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.

Здесь мне нужно объявить строковую (или char?) переменную с именем rating, которая принимает входные данные из текстового файла.И пусть он будет разделен пробелами (извините, если я не правильно использую терминологию), чтобы каждый символ "-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 ]

2 голосов
/ 22 января 2012

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

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;
}

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

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

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

    Причина этого в том, что теперь завтра вы можете изменить ArrayList на что-то другое.

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

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


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

Итак, вы говорите, что Столбец представляет Книгу (каждый столбец - это отдельная книга), а строки представляют покупателя (каждая строка - отдельный покупатель) ...

Допустим, я выбираю -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

Скажите, что клиент 'Customer3` добавлен.

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

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


Теперь, если вы хотите добавить что-то в память 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 будет кратким и будет работать лучше.

...