Прочитать матрицу из файла java
Конфигурация компьютера | |
Процессор: Intel Core i7 10700 2.9-4.8GHz | |
Материнская плата: ASUS Prime B460M-A s-1200 B460 | |
Память: G.Skill DDR4 32GB 2x16GB 3000MHz Aegis | |
HDD: SSD M.2 500GB Samsung 970 EVO Plus + SATA 2TB Toshiba P300 | |
Звук: Realtek ALC887 (Intel HD Audio) | |
Блок питания: 550W be quiet! Straight Power 11 | |
Монитор: Samsung E2320 (1920x1080, 23'') | |
Ноутбук/нетбук: MacBook Pro (13-inch, 2019, Four Thunderbolt 3 ports) | |
ОС: Gentoo Linux amd64 / Mac OSX Monterey | |
Индекс производительности Windows: faster than any windows | |
Прочее: Scythe Kotetsu Mark II |
Потому что в методе split регулярка задаёт шаблон разделителя, а не всей разделяемой строки. Пока в строке после имени файла ожидались лишь цифры и пробелы, можно было проделать трюк с проверкой на наличие таких символов после пробела и таким образом не считать разделителем пробелы внутри имени файла. Если после этого пробела есть символы, не удовлетворяющие условию, например, буквы. Именно это делает часть
до конца строки не должно быть ничего кроме максимум трёх чисел, разделённых пробелами. К слову, примерно то же самое можно написать проще, но всё равно не спасает:
Можно пытаться дальше развивать этот шаблон, но в конечном итоге в имени файла может встретиться числа, окруженное пробелами, например File 123 name.txt - и всё, в любом случае это число будет выделено в отдельный элемент массива, а не будет частью имени файла, как должно быть. Так что этот путь тупиковый, в смысле использование split.
А вот написать регулярку, соответствующую всей строке целиком - это возможно и совсем несложно. Что и сделал. Но только тогда split уже не годится.
Мне нужно вычислить произведение двух матриц. У меня есть 2 файла с двумя разными целыми числами (матрицами).
file1.txt
4 3 4 6
-1 10 4 -1
4 7 2 -8
file2.txt
3 0 0
0 3 0
0 0 3
0 2 4
Как мне прочитать данные файлы отдельно в двумерный массив, чтоб было удобно умножить. Я видел разные коды, где указываются в начале размер матрицы, но что если это могут быть разные матрицы? Буду благодарен если покажите пример.
Прочитать из текстового файла символы, вычисть из их кодов 8 а затем умножить на 2
Написать программу: Прочитать из текстового файла символы, вычисть из их кодов 8 а затем умножить.
Считать матрицу с файла и умножить её элементы на два
дан файл с матрицей 4 5 6 6 4 5 3 2 8 2 7 3 надо считать матрицу в файле и умножить её на 2.
Прочитать матрицу из файла
Как считать матрицу с файла, а позже после каждой строки найти сумму положительных элементов?
Прочитать матрицу из файла
Только начал изучение языка, понимаю, что прога простая, но прошу помочь: Нужно написать программу.
Files.readAllLines(), для каждой строки split. Дальше знаешь количество строк, количество элементов в каждой строке - создаешь матрицу, разбираешь свои строки, например Integer.parseInt и т.д.
Files.readAllLines(), для каждой строки split. Дальше знаешь количество строк, количество элементов в каждой строке - создаешь матрицу, разбираешь свои строки, например Integer.parseInt и т.д.
создаешь класс Матрица, его полем делаешь двумерный массив. далее, делаешь метод получения этого массива из файла, а для умножения матриц делаешь два метода, в этом классе, один статический, куда параметрами кидаешь две матрицы, второй когда этот объект умножается на другой. в обеих методах делаешь выброс IllegalArgumentException, если матрицы нельзя умножить.
Из файла F1 прочитать матрицу A (10,20)
Из файла F1 прочитать матрицу A (10,20). Вычислить сумму элементов каждой строки, записать в.
Прочитать матрицу из файла
Нужно написать функцию, считывающую из текстового файла матрицу 5x5 для продолжения работы уже с.
Прочитать матрицу из файла
Добрый день. Такое задание получил, интернет перерыл, ничего не нашел. Прочитать размеры матрицы n.
Прочитать матрицу М (10, 12) из файла F1.
Прочитать матрицу М (10, 12) из файла F1. Переставить строки этого массива так, чтобы сумма.
Прочитать матрицу из файла
Из файла F прочитать матрицу М (10, 15). Найти минимальный элемент этой матрицы, записать нули в.
Прочитать числа из файла в матрицу
есть файл, пока в нем каждое число записано с новой строки. после как прочитал имею такое: string.
Пока что я создал объект Scanner файла и поместил каждую строку в текстовый массив:
Таким образом, текстовый файл теперь содержится в массиве строк, где каждая строка является новым элементом массива. Прямо сейчас я хотел бы разделить массив на два массива, каждый из которых является матрицами. Как мне продолжить? (примечание: я новичок и хочу простые ответы (без Arraylist, hashmap и т. д.), поэтому этот вопрос не дублирует Как читать две матрицы из текстового файла в java, потому что он использует BufferedReader, и есть другие потенциальные повторяющиеся вопросы , поэтому я хотел бы прояснить это)
Что у меня сейчас после топа:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Этот код кажется логически звучащим – мы считываем целое число из файла, затем следующую строку, затем второе целое число. Если вы попытаетесь запустить этот код, исключение InputMismatchException будет выдано без очевидной причины.
Если вы начнете отладку и распечатаете отсканированное, вы увидите, что в хорошо загружено, но Строки пусты.
Почему это так? Первое, что важно отметить, это то, что как только Сканер считывает что-либо из файла, он продолжает сканирование файла с первого символа после ранее отсканированных данных.
Например, если бы в файле было “12 13 14” и мы один раз вызвали .nextInt () , сканер впоследствии сделал бы вид, что в файле было только “13 14”. Обратите внимание, что пробел между “12” и “13” все еще присутствует.
Вторая важная вещь, которую следует отметить, – первая строка в нашем example.txt файл содержит не только номер 12 , он содержит то, что он назвал “символом новой строки”, и на самом деле это 12\n вместо просто 12 .
Наш файл, на самом деле, выглядит так:
Когда мы впервые вызываем .nextInt() , Сканер считывает только число 12 и оставляет первое \n непрочитанным.
..следующая строка() затем считывает все символы, которые сканер еще не прочитал, пока не достигнет первого символа \n , который он пропускает, а затем возвращает прочитанные символы. Именно в этом и заключается проблема в нашем случае – у нас остался символ \n после прочтения 12 .
Поэтому, когда мы вызываем .nextLine () , в результате мы получаем пустую строку, так как Сканер не добавляет символ \n в возвращаемую строку.
Теперь Сканер находится в начале второй строки вашего файла, и когда мы пытаемся вызвать .nextInt() , Сканер обнаруживает что-то, что не может быть проанализировано в int и выдает вышеупомянутое Исключение InputMismatchException .
Решения
- Поскольку мы знаем, что именно не так в этом коде, мы можем жестко прописать обходной путь. Мы просто “потребим” символ новой строки между .nextInt() и .nextLine() :
- Учитывая, что мы знаем, как example.txt отформатирован, мы можем прочитать весь файл строка за строкой и проанализировать необходимые строки с помощью Integer.parseInt() :
Сканер
Каким бы приятным и простым ни был предыдущий метод, он полезен только для чтения файла строка за строкой. Что произойдет, если все данные будут храниться в одной строке?
Сканер – это простой в использовании инструмент для анализа примитивных типов и строк. Использование Сканера может быть настолько простым или сложным, насколько этого хочет разработчик.
Простым примером того, когда мы предпочли бы использовать Сканер , было бы, если бы в нашем файле была только одна строка, и данные должны быть проанализированы во что-то полезное.
Разделитель – это последовательность символов, которую Сканер использует для разделения значений. По умолчанию он использует ряд пробелов/вкладок в качестве разделителя (пробелы между значениями), но мы можем объявить наш собственный разделитель и использовать его для анализа данных.
Давайте взглянем на пример файла:
В таком случае легко заметить, что все значения имеют общий разделитель. Мы можем просто объявить, что” -“, окруженное любым количеством пробелов, является нашим разделителем.
Запуск этого фрагмента кода приведет к тому, что мы получим ArrayList с этими элементами:
С другой стороны, если бы мы использовали только разделитель по умолчанию (пробел), то ArrayList выглядел бы так:
Сканер имеет некоторые полезные функции для анализа данных, такие как nextInt() , nextDouble () и т.д.
Важно : Вызов .nextInt() будет НЕ возвращать следующее int значение, которое можно найти в файле! Он вернет значение int только в том случае, если следующие элементы Сканер “сканирует” являются допустимым значением int , в противном случае будет выдано исключение. Простой способ убедиться, что исключение не возникает, – выполнить соответствующую проверку “имеет”, как .hasNextInt() перед фактическим использованием .nextInt() .
Даже если мы не видим этого, когда мы вызываем такие функции, как scanner.nextInt() или scanner.hasNextDouble () , Сканер использует регулярные выражения в фоновом режиме.
Очень важно: | Чрезвычайно Распространенная ошибка при использовании Сканера возникает при работе с файлами, содержащими несколько строк , и использовании . nextLine () в сочетании с . nextInt () , nextDouble () и т. Д.
Давайте взглянем на другой файл:
Часто новые разработчики, использующие Сканер , пишут код, подобный:
3 ответа
Как сказал @Rob, это действительно обременительно делать без динамических структур данных, таких как ArrayList. Но, тем не менее, вот код, который выполняет вашу работу (учитывая, что у вас всего две матрицы), без использования каких-либо списков:
Для каждой матрицы выполняем одинаковые операции: -Сначала мы просматриваем матрицу, чтобы подсчитать ее размер, чтобы иметь возможность инициализировать ее, после этого мы идем строка за строкой и анализируем каждое число.
Вы также можете поместить всю работу для одной матрицы в функцию (и позаботиться о границах) и вызвать ее, пока у вас еще есть больше матриц.
Делай то, что хочешь. К сожалению, сделать это с 2D-массивами значительно сложнее, поскольку после того, как вы установили размер массива, его сложно изменить. Поэтому использовать ArrayList намного проще.
Поскольку вы не хотите использовать List, а размеры массивов нельзя изменить после инициализации, это непросто.
Есть два способа: прочитать файл и инициализировать массивы, зная размер (как опубликовал @Maaddy), или «изменить размер» массивов. Это невозможно, но это возможно, если вы используете Arrays.copyOf() , чтобы вы могли создать новый массив.
Идея состоит в том, чтобы создать «трехмерный» массив, в котором вы можете хранить: матрицу, строку и столбец; а затем начать читать файл. Каждый раз, когда вы найдете слово, весь массив будет обновляться, создавая новый массив с большей длиной.
Если слово «матрица», дополнительная длина будет добавлена к первой позиции (позиции, которая «хранит» матрицу).
Если слово - «строка», то пробел будет добавлен для текущей матрицы. Таким образом, текущая матрица будет иметь еще один массив, в котором будут храниться значения столбцов.
Если слово другое, то это значение столбца. Размер столбца изменится, и он будет добавлен в правильное положение.
Обратите внимание, что если найдено слово «матрица» или «строка», новый массив инициализируется без длины. Это потому, что размер будет изменен позже, когда это будет необходимо.
У меня есть двумерный массив int в файле "array.txt". Я пытаюсь прочитать все элементы в файле в двумерном массиве. У меня проблема с копированием. Он показывает все элементы, имеющие значение «0» после копирования вместо их исходного значения. Пожалуйста помогите. Мой код:
Я попробовал ваш код, он печатает значения массива, но выдает исключение, если вы достигаете конца файла!
Это будет потреблять что-то из входного потока сканера. Вместо этого попробуйте использовать while (input.hasNextInt())
В зависимости от того, насколько надежным должен быть ваш код, вы также должны проверять внутри цикла for, что что-то доступно для чтения.
Альтернатива с использованием ArrayLists (предварительное чтение не требуется):
Это позволяет вам узнать размер массива до того, как вы его прочитаете, поскольку массивы в Java имеют фиксированный размер (т. е. вы не можете «расширить» их). Вы можете использовать ArrayList из ArrayLists, чтобы выполнить это, открыв файл только один раз (или реализовать структуру, подобную ArrayList, самостоятельно, хотя обычно это не рекомендуется), или вы можете создать достаточно большой массив, в который поместится все, что вы читаете. Обычно мне нравятся массивы с точным соответствием или решения ArrayLists.
Затем используйте ArrayList, если другой метод заставляет вас читать файл дважды. Честно говоря, я не вижу причин использовать в этом случае массив фиксированного размера. Честно говоря, я тоже не понимаю, почему вы хотите переопределить ArrayList.
Добавлено дополнение для кода, использующего ArrayList из ArrayLists. Предварительное чтение не требуется. Лично я обнаружил, что полезно знать оба метода, хотя вы правы в том, что использование ArrayList проще и менее подвержено ошибкам. Есть только одна причина, по которой я бы реализовал свой собственный ArrayList: это было для назначения класса. В противном случае я бы рекомендовал просто использовать класс Java ArrayList или выполнить предварительное чтение, чтобы определить, какой размер нам нужно прочитать (как указано выше).
Проблема в том, что когда вы достигаете конца файла, возникает исключение, что элемент usch не существует.
Я знал, что ловить без обработки исключения, но это временно работает. Имейте в виду, что я поместил файл вне исходной папки.
Что ж, проблема может заключаться в том, что у вас есть пара вложенных циклов для чтения чисел, застрявших внутри этого цикла while. Зачем вам перечитывать значения массива после того, как вы прочитали их один раз? И обратите внимание: если в файле есть что-нибудь после последнего числа, вы заполните массив тем, что возвращает .nextInt() после достижения конца файла!
редактировать — ну, .nextInt() должен генерировать исключение, я думаю, когда заканчивается ввод, так что проблема может быть не в этом.
Существует множество способов чтения и записи файлов на Java .
Обычно у нас есть некоторые данные в памяти, с которыми мы выполняем операции, а затем сохраняем их в файле. Однако, если мы хотим изменить эту информацию, нам нужно поместить содержимое файла обратно в память и выполнить операции.
Если, например, наш файл содержит длинный список, который мы хотим отсортировать, нам придется прочитать его в соответствующей структуре данных, выполнить операции, а затем сохранить его еще раз – в данном случае ArrayList .
Этого можно достичь с помощью нескольких различных подходов:
- Файлы.Строки для чтения()
- Устройство для чтения файлов
- Сканер
- Буферизатор
- Поток ввода объекта
- API потоков Java
Файлы.Строки для чтения()
Начиная с Java 7, можно очень простым способом загрузить все строки файла в ArrayList :
Мы также можем указать кодировку для обработки различных форматов текста, если это необходимо:
Files.ReadAllLines() автоматически открывает и закрывает необходимые ресурсы.
Поток ввода объекта
ObjectInputStream следует использовать только вместе с ObjectOutputStream . Что эти два класса помогают нам сделать, так это сохранить объект (или массив объектов) в файл, а затем легко прочитать из этого файла.
Это можно сделать только с классами, реализующими Сериализуемый интерфейс. Интерфейс Сериализуемый не имеет методов или полей и служит только для определения семантики сериализуемости:
Вывод
Существует несколько различных способов, с помощью которых вы можете считывать данные из файла в ArrayList . Когда вам нужно только прочитать строки как элементы, используйте Files.ReadAllLines ; когда у вас есть данные, которые можно легко проанализировать, используйте Сканер ; при работе с большими файлами используйте FileReader , завернутый в BufferedReader ; при работе с массивом объектов используйте ObjectInputStream (но убедитесь, что данные были записаны с использованием ObjectOutputStream ).
API потоков Java
Начиная с Java 8, еще одним быстрым и простым способом загрузки содержимого файла в Список массивов было бы использование Java Streams API :
Однако имейте в виду, что этот подход, как и Files.ReadAllLines () , будет работать только в том случае, если данные хранятся в строках.
Приведенный выше код не делает ничего особенного, и мы редко использовали бы потоки таким образом. Однако, поскольку мы загружаем эти данные в ArrayList , чтобы мы могли обработать их в первую очередь, потоки предоставляют отличный способ сделать это.
Мы можем легко сортировать/фильтровать/сопоставлять данные перед их сохранением в списке массивов :
Буферизатор
BufferedReader считывает текст из потока ввода символов, но делает это путем буферизации символов для обеспечения эффективных операций .read () . Поскольку доступ к жесткому диску занимает очень много времени, BufferedReader собирает больше данных, чем мы просим, и сохраняет их в буфере.
Идея заключается в том, что когда мы вызываем .read() (или аналогичную операцию), мы, скорее всего, скоро снова прочитаем из того же блока данных, из которого мы только что прочитали, и поэтому “окружающие” данные хранятся в буфере. В случае, если бы мы хотели прочитать его, мы бы прочитали его непосредственно из буфера, а не с диска, что гораздо эффективнее.
Это подводит нас к тому, что BufferedReader хорошо подходит для чтения больших файлов. BufferedReader имеет значительно большую буферную память, чем Сканер (8192 символа по умолчанию против 1024 символов по умолчанию соответственно).
BufferedReader используется в качестве оболочки для других Читателей , и поэтому конструкторы для BufferedReader принимают Читатель объект в качестве параметра, например Читатель файлов .
Мы используем пробные ресурсы, поэтому нам не нужно закрывать считыватель вручную:
Рекомендуется обернуть файловый редактор с Буферным читателем , именно из-за преимуществ производительности.
Читайте также: