Попробуйте создать 2D ArrayList в Java - PullRequest
1 голос
/ 26 февраля 2012

Я пытаюсь прочитать файл.Я хочу сохранить содержимое файла в двухмерном массиве, где каждое место в списке содержит один символ.Я хочу, чтобы каждая строка в исходном текстовом файле была одной строкой в ​​списке массивов.Например, если ввод из текстового файла был:

a, b, c

d, e, f

g, h, i

тогда массив, надеюсь, будет выглядеть так: {[a, b, c], [d, e, f], [g, h, i]}.К сожалению, на данный момент мой результат просто [a, b, c, d, e, f, g, h, i].Любые идеи будут оценены, я новичок в Java.Спасибо.

import java.util.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Coursework1
{
    public static void main(String[] args)
    {
    try {
        List<String> list = new ArrayList<String>();

        String thisLine = null;
        BufferedReader br;
        br = new BufferedReader(new FileReader("map.txt"));

        while ((thisLine = br.readLine()) != null) {
        list.add(thisLine);
        }

        char[][] firstDimension = new char[list.size()][];
        for (int i = 0; i < list.size(); i++) {
        firstDimension[i] = list.get(i).toCharArray();
        }


        for (int i=0;i<firstDimension.length;i++) {
        for (int j=0;j<firstDimension[i].length;j++) {
            System.out.println(firstDimension[i][j]);
        }
        }

    } 
    catch (Exception e) {
        e.printStackTrace();
    }
    }
}

Ответы [ 5 ]

2 голосов
/ 26 февраля 2012

Похоже, вы не до конца понимаете разницу между массивом и списком массивов.

Массив - это контейнерный объект, который содержит фиксированное количество значений одного типа. Длина массива устанавливается при его создании. После создания его длина фиксируется. Таким образом, вы должны знать размер, прежде чем создавать его, или вы должны создать его достаточного размера.

С другой стороны, ArrayList - это коллекция (сложный тип, см. в этом руководстве для получения дополнительной информации), которая может содержать простые объекты, коллекции, ... ArrayList можно представить себе как динамический массив - вам не нужно знать начальный размер, он автоматически изменяется при добавлении или удалении из него элементов.

Хорошая привычка перебирать ArrayList вот так

List<String> names = new ArrayList<String>();
// add something

// foreach loop
for (String name : names) {
    // here you have access directly to the value 
    // and you don't have to write list.get(index)
    System.out.println(name);
}

Теперь к вам вопрос. Если вы прочитаете ссылку выше, вы сможете создать ее самостоятельно. Но если вы все еще не знаете:

List<List<String>> twoDimensionList = new ArrayList<List<String>>();

Итерация с циклом foreach

for (List<String> innerList : twoDimensionList) {
    for (String value : innerList) {
        ...
    }
}
2 голосов
/ 26 февраля 2012

Ваш ответ на самом деле правильный и полностью функционирующий.Ваш тестовый код неверен, так как он содержит слишком много новых строк.

for (int i=0;i<firstDimension.length;i++) 
{
       System.out.println();
       for (int j=0;j<firstDimension[i].length;j++) 
       {
            System.out.print(firstDimension[i][j]);
       }
}
1 голос
/ 26 февраля 2012

Вы можете встраивать списки в списки, например:

List<List<String>> matrix = new ArrayList<List<String>>();

Затем, получая доступ к элементам, которые вы делаете,

matrix.get(1).get(2);

РЕДАКТИРОВАТЬ: Я бы также предложил вам подумать о том, если вы хотите Array или ArrayList .Они не одинаковы.Изменяемый размер списка массивов (вы можете добавлять к нему все больше и больше элементов, вам не нужно иметь столько элементов в списке массивов. Это позволяет вам делать такие вещи, как объект List<List<String>>, где не каждую секундуразмерность такой же длины. С другой стороны, массивы имеют определенный размер, связанный с ними, что позволит вам обеспечить, чтобы все строки имели одинаковую длину, а все столбцы имели одинаковую высоту ...

0 голосов
/ 26 февраля 2012

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

0 голосов
/ 26 февраля 2012

Ваш код работает, вы просто распечатываете неверные результаты. Попробуйте:

        for (int i = 0; i < firstDimension.length; i++)
        {
            for (int j = 0; j < firstDimension[i].length; j++)
            {
                System.out.print(firstDimension[i][j]);
            }
            System.out.println();
        }

Это печатает символы с той же строки, ну, на той же строке ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...