#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("\[\]", ""));
}