Чтение двух текстовых файлов и помещение их в двумерный массив

#java #multidimensional-array

#java #многомерный массив

Вопрос:

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

 public static void main(String args[]) throws Exception {
    File file1 = new File("data/books.txt");
    File file2 = new File("data/names.txt");
    Scanner names = new Scanner(file1);
    Scanner titles = new Scanner(file2);
    int rows = names;
    int columns = titles;
    int [][] myArray = new int[rows][columns];
    while(sc.hasNextLine()) {
        for (int i=0; i<myArray.length; i  ) {
            String[] line = sc.nextLine().trim().split(" ");
            for (int j=0; j<line.length; j  ) {
                myArray[i][j] = Integer.parseInt(line[j]);
            }
        }
    }
    System.out.println(Arrays.deepToString(myArray));
}
 

Комментарии:

1. Почему вы ставите sc.hasNextLine() , если ваши сканеры называются именами и названиями? Вы можете начать с изменения этого, например.

2. Очень запутанный, я пытался найти ответ, который поможет вам найти решение, но в итоге список вопросов стал расти. Почему сканер имен использует файл книг, а сканер названий использует файл имен? Почему ни один сканер не используется для фактического сканирования чего-либо? Как вы объявили целочисленные значения равными объектам сканера??? Что должен представлять myArray? Исходя из вопроса, я бы предположил, что это пары книг и авторов, но это целочисленный массив (если только всем вашим книгам и авторам не присвоены числовые идентификаторы). Откуда взялся sc?

3. Жаль, что комментарии такие короткие… Я не собираюсь просто выкладывать список ошибок в вашей работе. Я просто в замешательстве. Если вы можете помочь прояснить, что здесь должно происходить, я был бы рад помочь вам создать решение, которое достигнет этой цели 🙂

4. Приведите пример данных, содержащихся в каждом из текстовых файлов.

Ответ №1:

Похоже, что у вас есть два файла данных с параллельными связанными данными, тогда как первая строка из names.txt находится ли имя автора названия книги в первой строке books.txt файл и так далее.

Весь этот жаргон, который вы собрали в своем коде, — это попытка получить значение длины инициализации для вашего 2D-массива, которое, конечно, имеет совершенно неправильный тип данных (int[][] ). Он должен иметь тип String[][] . Я думаю, что вы пытаетесь достичь чего-то подобного тому, что я предоставляю в приведенном ниже методе. Прочитайте комментарии к коду:

 public static String[][] readTitleAuthorFiles(String bookTitlesFilePath, String authorsFilePath) {
    // Declare the 2D Array and initialize to null in case a problem arises.
    String[][] booksArray = null;  
    List<String> bookTitles = new ArrayList<>();  // List to hold titles from titles file.
    List<String> authorNames = new ArrayList<>(); // List to hold author names from names file.
    
    // Read in titles first.
    File file = new File(bookTitlesFilePath);
    try (Scanner reader = new Scanner(file)) {
        String line;
        while(reader.hasNextLine()) {
            line = reader.nextLine().trim();
            bookTitles.add(line);
        }
    }
    catch (FileNotFoundException ex) {
        System.err.println(ex);
        return null;
    }
    
    // Read in Authors
    file = new File(authorsFilePath);
    try (Scanner reader = new Scanner(file)) {
        String line;
        while(reader.hasNextLine()) {
            line = reader.nextLine().trim();
            authorNames.add(line);
        }
    }
    catch (FileNotFoundException ex) {
        System.err.println(ex);
        return null;
    }
    
    // The Lists (bookTitles and authorNames)are now filled. 
    // These two collections are to be considered parallel
    // whereas index 1 of one list is directly related to 
    // index 1 of the other list.
    
    // Initialize our String[][] booksArray.
    booksArray = new String[bookTitles.size()][2];
    
    // Fill the 2D booksArray[][] from the two Lists
    for (int i = 0; i < bookTitles.size(); i  ) {
        booksArray[i][0] = bookTitles.get(i);
        booksArray[i][1] = authorNames.get(i);
    }
    
    // Return our created 2D String Array (booksArray[][]).
    return booksArray;  
}
 

Чтобы использовать этот метод:

 // The 'books.txt' file must be provided first.
String[][] books = readTitleAuthorFiles("data/books.txt", "data/names.txt");
    
// Display the 2D String Array in console:
for (int i = 0; i < books.length; i  ) {
    System.out.println(Arrays.toString(books[i]).replaceAll("\[\]", ""));
}