Как прочитать каждую строку текстового файла в 2D-массив в Java

Я пытаюсь создать систему входа в систему на Java и сохранил информацию администратора в текстовом файле в следующем формате:

Hannah,Joshua,Female,373ac,admin123

Leena,Kevin,Female,3283c,admin123

Четвертый индекс (373ac) — это имя пользователя, а пятый (admin123) — пароль. Каждый администратор получит новое имя пользователя и отдельную строку в файле.

Каждый раз, когда администратор входит в систему, он вводит свое имя, и программа должна искать файл со строкой, которая начинается с его имени, и сравнивать имя пользователя и пароль, чтобы они могли войти в систему. Я думаю, что лучший способ - это двумерный массив. . У меня есть этот код до сих пор, но он не читает его как 2D-массив, а просто один массив со всеми строками. Как это:

[Hannah,Joshua,Female,373ac,admin123,Leena,Kevin,Female,3283c,admin123]

Не могли бы вы мне помочь?

public class ReadFile {
    public static void main(String[] args) throws Exception {
        BufferedReader bufReader = new BufferedReader(new FileReader("Admin.txt"));
        ArrayList<String> listofLines = new ArrayList<>();

        String line = bufReader.readLine();
        while (null != (line = in.readLine())) {
            listofLines.add(line);
        }

        bufReader.close();

        int [][] map = new int[bufReader.size()][];
        int q = 0;
        for (int i = 0; i < map.length; q++) {
            String[] rooms = bufReader.get(i).split(",");
            map[i] = new int[rooms.length];
            
            for (int w = 0; w < rooms.length; w++) {
                map[q][w] = Integer.parseInt(rooms[w]);
            }

            System.out.println(Arrays.toString(map[q]));
        }
    }
}

Можете ли вы предоставить более подробную информацию об «одном массиве», который создает ваш код?

mmartinez04 31.10.2022 13:06

Я внес изменения @mmartinez04

user18258423 31.10.2022 13:09

где переменная «in», объявленная в строке «in.readLine()» внутри цикла while.

Jishnu Prathap 31.10.2022 13:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы заполняете listofLines, но никогда не используете его

Вместо итерации на основе bufReader, почему бы не использовать listofLines?

Кроме того, почему вы используете как i, так и q в качестве индексов? Одного вроде достаточно

Обновлено: массив int[][] также должен быть String[][]

String [][] map = new String[listofLines.size()][];

for (int i = 0;i<map.length;i++){

    String[] rooms = listofLines.get(i).split(",");
    map[i] = new int[rooms.length];
        
    for(int w = 0; w<rooms.length;w++){
        map[i][w] = rooms[w];
    }

    System.out.println(Arrays.toString(map[i]));
}

Кроме того, если вы хотите сделать свой код более кратким

String [][] map = new String[listofLines.size()][];

for (int i = 0;i<map.length;i++){

    map[i] = listofLines.get(i).split(",");

    System.out.println(Arrays.toString(map[i]));
}

Для вашего bufReader попробуйте изменить код на этот

String line = bufReader.readLine();
while (line != null) {
    listofLines.add(line);
    line = bufReader.readLine();
}

Кажется, я получаю сообщение об ошибке «не могу найти символ» для listOfLines. Как я могу это исправить?

user18258423 31.10.2022 13:17

Извините, я написал listOfLines, но вы объявили его как listofLines, просто исправил

mmartinez04 31.10.2022 13:17

Исключение в потоке "main" java.lang.NumberFormatException: для входной строки: "Leena" ---- я получаю эту ошибку

user18258423 31.10.2022 13:23

Я решил ошибку readLine. Спасибо

user18258423 31.10.2022 13:23

Я не уверен, почему вы используете целочисленный массив. Вместо этого вы должны использовать массив String[][] и избавиться от Integer.parseInt(rooms[w]) и просто использовать room[w]

mmartinez04 31.10.2022 13:26

Извините, я новичок в Java и только что исправил это, но теперь печатается только вторая строка текстового файла.

user18258423 31.10.2022 13:30

Есть ли способ, которым обе строки могут быть напечатаны как [[Hannah,Joshua,Female,373ac,admin123],[Leena,Kevin,Female,3‌​283c,admin123]]

user18258423 31.10.2022 13:33

да, удалите оператор System.out.println в цикле for и вместо этого поместите System.out.println(Arrays.deepToString(map)) после закрытия цикла for

mmartinez04 31.10.2022 13:38

Я все еще получаю только вторую строку текстового файла

user18258423 31.10.2022 13:41

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

mmartinez04 31.10.2022 13:49

Итак, предположим, я просто хочу распечатать Ханну, как я могу это сделать?

user18258423 31.10.2022 15:12
Ответ принят как подходящий

Вы можете использовать Files.lines(), чтобы прочитать файл как Stream<String>.

static String[][] readFileAs2DArray(String fileName) throws IOException {
    try (Stream<String> stream = Files.lines(Path.of(fileName), Charset.defaultCharset())) {
        return stream
            .map(line -> line.split(","))
            .toArray(String[][]::new);
    }
}

public static void main(String[] args) throws IOException {
    String[][] result = readFileAs2DArray("Admin.txt");

    for (String[] line : result)
        System.out.println(Arrays.toString(line));
}

вывод:

[Hannah, Joshua, Female, 373ac, admin123]
[Leena, Kevin, Female, 3283c, admin123]

Есть ли способ получить доступ только к 373ac?

user18258423 31.10.2022 15:22

@HannahJoshua Вы можете получить доступ к 373ac с помощью result[0][3].

user17233545 31.10.2022 15:28

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

user18258423 31.10.2022 15:53

Вы не можете read only that line of the file. Другие варианты: (1) вы сначала читаете все строки и ищете оттуда. (2) вы сохраняете его в базе данных и ищете там;

user17233545 31.10.2022 20:28

Другие вопросы по теме