Java как получить массив строк из файла

Обновлено: 01.07.2024

Массивы можно составлять не только из чисел, как уже упоминалось, но и из строк. В этом уроке мы рассмотрим массивы строк в Java на примерах, а также три упражнения с ответами.

Строки текста можно помещать в массив Java. Это делается так же, как и для переменных int:

Код выше устанавливает массив строк с 5 позициями. Затем текст присваивается каждой позиции в массиве.

Этот цикл, который обходит все позиции в массиве, распечатывая все, что есть в каждой позиции:

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

Когда вышеуказанная программа запустится, окно вывода будет выглядеть так:

Вы можете выполнить сортировку массивов строк в Java также, как и массивов чисел. Но сортировка происходит в алфавитном порядке по возрастанию, что означает, что «аа» будет перед «аб».

Java использует символы Юникода для сравнения одной буквы в вашей строке с другой. Это означает, что заглавные буквы будут стоять перед строчными. Попробуйте следующий код:

При запуске программы в окне «Вывод» отобразится следующее:

Несмотря на то, что мы отсортировали наш массив строк, слова «Java» и «Это» идут первыми. Во-первых, английский алфавит Java-программа всегда ставит вначале, также отсортировывая по алфавитному порядку. Во-вторых, что касается слова «Это», по алфавитному порядку, оно должно было идти последним. И так и было бы, если бы все буквы были строчные. Измените в своем программном коде заглавную букву «Э» на строчную «э». Теперь снова запустите свою программу. Теперь в окне вывода отобразится следующее:

Как видите, слово «это» теперь внизу. Мы рассмотрим строки более подробно в следующем уроке, поэтому не беспокойтесь, если что-то непонятно. Вместо этого попробуйте следующие упражнения.

Упражнение G

Установите массив для хранения следующих значений в следующем порядке: 23, 6, 47, 35, 2, 14. Напишите программу, чтобы получить среднее арифметическое для всех 6 чисел. (Вы можете использовать целые числа, то, что округлит ваш ответ.)

Упражнение H

Используя вышеприведенные значения, пусть ваша программа напечатает наибольшее число в массиве.

Упражнение I

Используя тот же массив, что и выше, пусть ваша программа распечатывает только нечетные числа.

У меня есть текстовый файл с набором массивов с конкретным номером, который я должен найти в массиве. Текстовый файл выглядит так:

Где число в скобках - это число, которое я должен найти с помощью бинарного поиска. а остальное это фактический массив. Я не знаю, как я мог бы получить этот массив из текстового файла и быть в состоянии прочитать его как фактический массив. [Это вопрос о предыдущем конкурсе по программированию, который я принимал, и собираюсь решить проблемы]

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

И использовал цикл while, чтобы иметь возможность перебирать файл и читать его.

Но я застрял на том, как заставить Java знать, что вещи в фигурных скобках - это массив, а вещи в круглых скобках - это то, что он должен использовать для поиска в двоичном поиске по указанному массиву.

3 ответа

Вы можете просто проанализировать каждую строку (номер для поиска и массив) следующим образом:

Если вам не нравится replaceAll, вы можете заменить первую строку в цикле на две ниже:

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

Ниже регулярное выражение должно соответствовать линии

Затем группа (1) выдаст цифру в скобках (в виде строки), а группа (2) - строку в фигурных скобках, которые можно разделить с помощью пробела, и пробел (если каждая запятая следует за пробелом) и получит массив чисел (снова как строки)

Надеюсь это поможет!

Чтобы прочитать файл, вы можете использовать Files.readAllLines()

Чтобы фактически разобрать каждую строку, вы можете использовать что-то вроде этого.

Во-первых, чтобы сделать вещи проще, удалите все пробелы из строки.

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

  • \(4*\) относится к (8) (пример выше)
  • \ относится к

Если вы не понимаете выражения, перейдите здесь.

Наконец, мы можем разобрать строку на две составляющие: число для поиска и int[] с фактическими значениями.

Разобрав оба этих компонента, вы можете выполнить бинарный поиск самостоятельно.

Чтобы работать с файлами, есть шикарный утилитный класс — java.nio.file.Files . У него есть методы просто на все случаи жизни. Все методы этого класса статические и работают с объектами типа Path. Методов очень много, поэтому мы рассмотрим только основные:

Метод Описание
Создает новый файл с путем path
Создает новую директорию
Создает несколько директорий
Создает временный файл
Создает временную директорию
Удаляет файл или директорию, если она пуста
Копирует файл
Перемещает файл
Проверяет, что путь — это директория, а не файл
Проверяет, что путь — это файл, а не директория
Проверяет, что объект по заданному пути существует
Возвращает размер файла
Возвращает все содержимое файла в виде массива байт
Возвращает все содержимое файла в виде строки
Возвращает все содержимое файла в виде списка строк
Записывает в файл массив байт
Записывает в файл строку
Возвращает коллекцию файлов (и поддиректорий) из заданной директории

2. Создание файлов и директорий

Файлы и директории создавать очень просто. Убедимся на примерах:

Код Примечание
Создает файл
Создает директорию
Создает директорию и все нужные поддиректории, если их не существует.

3. Копирование, перемещение и удаление

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

Код Примечание
Копирует файл
Перемещает и переименовывает файл
Удаляет файл

4. Проверка типа файла и факта существования

Когда у вас есть какой-то путь, полученный извне, вы бы хотели знать, это файл или директория. Ну и вообще: существует такой файл/директория или нет?

Для этого тоже есть специальные методы. Так же можно легко узнать длину файла:

Код Примечание

5. Работа с содержимым файла

И наконец, есть целая серия методов, которые позволяют легко прочитать или записать содержимое файла. Пример:

Массивы Java-это коллекции переменных одного типа, упорядоченные по индексу

Объявление массива

Переменная массива Java объявляется точно так же, как и переменная нужного типа, за исключением добавления [] после типа. Вот простой пример объявления:

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

Вот еще несколько примеров объявления:

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

У вас есть выбор места для квадратных скобок []. Первое вы уже видели, второе находится после имени переменной. Следующие объявления равнозначные:

Лучше указывать квадратные скобки [] после типа данных (например, String []), тогда код легче читать.

Создание

Когда вы объявляете переменную массива, вы объявляете только переменную (ссылку) на сам массив, но не создаете его. Процесс создания:

В этом примере создается массив типа int с пространством для 10 переменных int внутри.

Предыдущий пример создал массив int, который является примитивным типом данных. Возможно создать массив ссылок на объекты. Например:

Java позволяет создавать массив ссылок на любой тип объекта (на экземпляры любого класса).

Литералы

Язык программирования Java содержит ярлык для создания экземпляров массивов примитивных типов и строк. Если вы уже знаете, какие значения вставлять в массив, вы можете использовать литерал массива. Вот он как выглядит в коде Java:

Обратите внимание, как значения, которые будут вставлены в массив, перечислены внутри блока . Длина этого списка также определяет длину созданного массива.

Не нужно писать новую часть int [] в последних версиях Java. Достаточно:

Стиль работает для массивов всех примитивных типов, а также массивов строк. Вот пример строкового массива:

Длина не может быть изменена

После создания массива его размер не может быть изменен. В некоторых языках программирования (например, JavaScript) это возможно. Если вам нужна структура данных, похожая на массив, которая может изменить свой размер, вы должны использовать List или создать массив с изменяемым размером. В некоторых случаях допустимо использовать Java RingBuffer, который, кстати, реализован с использованием массива внутри.

Доступ к элементам

Каждая переменная в массиве также называется «элементом». Таким образом, в примере, показанном ранее, был создан массив с пространством для 10 элементов, и каждый элемент является переменной типа int.

Вы можете получить доступ к каждому элементу в массиве через его индекс. Вот пример:

В этом примере сначала устанавливается значение элемента (int) с индексом 0, а во-вторых, он считывает значение элемента с индексом 0 в переменную int.

Вы можете использовать элементы в массиве так же, как если бы они были обычными переменными:

  • читать их значения;
  • присваивать им значения;
  • использовать в вычислениях;
  • передавать конкретные элементы в качестве параметров для вызовов методов.

Индексы элементов в массиве всегда начинаются с 0 и продолжаются до номера 1 ниже размера массива. Таким образом, в приведенном выше примере с массивом из 10 элементов индексы идут от 0 до 9.

Как получить длину?

Организация доступа к длине массива через его поле длины:

В этом примере переменная с именем arrayLength будет содержать значение 10 после выполнения второй строки кода.

Итерация

Как перебрать все элементы массива, используя цикл Java for:

  1. Сначала создается массив ссылок String. Когда впервые создаете массив ссылок на объекты, каждая из ячеек в массиве указывает на ноль, а не на объект.
  2. Первый из двух циклов for выполняет итерацию по массиву String, создает строку и делает ссылку на ячейку этой строкой.
  3. Второй из двух циклов for перебирает массив String и печатает все строки, на которые ссылаются ячейки.

Если бы это был массив int (примитивные значения), он мог бы выглядеть так:

Переменная i инициализируется равной 0 и работает до длины массива минус 1. В этом случае i принимает значения от 0 до 9, каждый раз повторяя код внутри цикла for один раз, и для каждой итерации i имеет другое значение.

Как перебрать массив с помощью цикла «for-each» в Java. Вот как это выглядит:

Цикл for-each дает вам доступ к каждому элементу в массиве по одному, но не информацию об индексе каждого элемента. Есть доступ только к значению. Изменить значение элемента в этой позиции невозможно. Если это нужно, используйте обычный цикл for, как показано ранее.

Цикл for-each также работает с массивами объектов. Вот пример, как выполнить итерацию массива объектов String:

Многомерные массивы

Вы создаете многомерный массив в Java, добавляя один набор квадратных скобок ([]) к измерению, которое хотите добавить. Вот пример, который создает двумерный массив:

В этом примере создается двумерный массив элементов int. Он содержит 10 элементов в первом измерении и 20 во втором. Другими словами, массив массивов имеет пространство для 10 массивов int, а каждый массив int имеет пространство для 20 элементов int.

Для получения доступа к элементам в многомерном массиве с одним индексом на измерение нужно использовать два индекса. Вот пример:

Переменная с именем oneInt будет содержать значение 129 после выполнения последней строки кода Java.

Итерация многомерных

При итерации многомерного массива, нужно выполнять итерацию каждого измерения массива отдельно:

Вставка элементов

Как вставить новое значение в массив в Java:

  1. Создается массив.
  2. Он определяет индекс вставки и новое значение для вставки.
  3. Все элементы от индекса вставки и до конца массива сдвигаются на один индекс вниз в массиве.

Обратите внимание, что это сместит последнее значение в массиве из массива(оно будет просто удалено).

Приведенный выше код вставки массива может быть встроен в метод:

Этот метод принимает массив int[] в качестве параметра, а также индекс для вставки нового значения и нового значения. Вставка элементов в массив, вызвав этот метод следующим образом:

Конечно, если метод insertIntoArray() находится в другом классе, нежели приведенный выше код, потребуется объект этого класса, чтобы вызывать метод. Если метод insertIntoArray() был статическим, нужно поместить имя класса и точку перед именем метода.

Удаление элементов

Код для удаления элемента из массива:

В этом примере сначала создается массив int. Затем он устанавливает значение элемента с индексом 10 равным 123. Потом пример удаляет элемент с индексом 10, перемещая все элементы ниже индекса 10 на одну позицию вверх в массиве. После удаления последний элемент в массиве будет существовать дважды. И в последнем, и во втором последнем элементе.

Приведенный выше код может быть встроен в метод. Вот как мог бы выглядеть такой Java-метод удаления массива:

Метод removeFromArray() принимает два параметра: массив для удаления элемента и индекс удаляемого элемента.

Конечно, если метод removeFromArray() находится в другом классе, нежели приведенный выше код, вам потребуется объект этого класса, чтобы вызывать метод. Или, если метод removeFromArray() был статическим, вам нужно поместить имя класса и точку перед именем метода.

Нахождение минимального и максимального значения в массивах

В Java нет встроенных функций для поиска минимального и максимального значения, поэтому нужно сделать это самостоятельно.

Как находить минимальное значение в массиве:

Чтобы использовать java.util.Arrays в ваших классах, вы должны импортировать его:

Копирование

Возможно несколькими способами.

Копирование массива путем итерации массива

Первые два массива int созданы. Во-вторых, исходный массив инициализируется значениями от 0 до 9 (от 0 до длины массива минус 1). В-третьих, каждый элемент в исходном массиве копируется в целевой массив.

Копирование с помощью Arrays.copyOf()

Вот как выглядит копирование массива:

Копирование с использованием Arrays.copyOfRange()

Метод Arrays.copyOfRange() копирует диапазон массива, не обязательно полный массив. Процесс копирования с ним:

Преобразование массивов в строки с помощью Arrays.toString()

Вы можете преобразовать массив примитивных типов в строку:

Первая строка создает массив int с 10 элементами. Цикл for инициализирует массив значениями от 10 до 1. В последней строке выводится значение, возвращаемое из Arrays.toString(). Возвращенная строка (которая печатается) выглядит так:

Сортировка

Вы можете отсортировать элементы массива с помощью метода Arrays.sort() в соответствии с порядком их сортировки:

Первая строка объявляет и создает экземпляр массива int длиной 10. Цикл for перебирает массив и вставляет значения в каждый элемент. Введенные значения будут идти от 10 до 1 в порядке убывания.

После цикла for массив преобразуется в строку с помощью Arrays.toString() и выводится на консоль (командная строка). Выход:

Затем массив сортируется с помощью Arrays.sort(). Элементы теперь будут упорядочены в порядке возрастания.

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

Сортировка объектов

Показанный ранее пример Arrays.sort() работает только для массивов примитивных типов данных, которые имеют порядок:

  • естественный;
  • числовой;
  • символьный в таблице ASCII (двоичное число, представляющее символ).

Вот первый класс для объектов, которые мы хотим отсортировать:

Вот первый пример сортировки массива объектов Employee по их имени с помощью метода Arrays.sort():

  1. Сначала объявляется массив.
  2. Три объекта Employee создаются и вставляются в массив.
  3. Метод Arrays.sort() вызывается для сортировки массива. В качестве параметра передаем массив employee и реализацию Comparator, которая может определять порядок объектов Employee. Это создает анонимную реализацию интерфейса Comparator.

В примере важно уловить реализацию метода compare() анонимной внутренней реализации интерфейса Comparator. Этот метод возвращает:

После сортировки массива мы перебираем его и выводим имена сотрудников. Вывод:

Обратите внимание, как порядок был изменен по сравнению с порядком, в котором они были первоначально вставлены в массив.

Сортировка объектов Employee по их идентификатору сотрудника на основании предыдущего примера с измененной реализацией метода compare() анонимной реализации интерфейса Comparator:

Обратите внимание, как метод compare() возвращает разницу между идентификаторами сотрудников, вычитая одно из другого. Это самый простой способ определить естественный порядок числовых переменных.

Чтобы сравнить объекты Employee в массиве сначала по их имени, а если оно совпадает, то по их идентификатору сотрудника, реализация compare():

Заполнение Arrays.fill()

Класс Arrays имеет набор методов с именем fill(), которые могут заполнять массив заданным значением. Это проще, чем перебирать массив и вставлять значение самостоятельно. Вот пример использования Arrays.fill() для заполнения массива int:

В этом примере создается массив int и заполняется значение 123 во всех элементах массива. Последняя строка примера преобразует массив в строку и выводит его на консоль:

Существует версия метода Arrays.fill(), которая принимает значения from и to index, поэтому только элементы с индексами в этом интервале заполняются заданным значением:

Этот пример заполняет только те элементы, которые имеют индексы 3 и 4(от 3 до 5 без 5) значением 123. Вывод:

Поиск с помощью Arrays.binarySearch()

Класс Arrays содержит набор методов с именем binarySearch(). Этот метод поможет вам выполнить бинарный поиск в массиве. Сначала массив должен быть отсортирован. Вы можете сделать это самостоятельно или с помощью метода Arrays.sort(), описанного ранее в этом тексте. Вот пример:

Вторая строка этого примера ищет в массиве значение 6. Метод binarySearch() возвращает индекс в массиве, в котором был найден элемент. В приведенном выше примере метод binarySearch() вернет 3.

Если в массиве существует более одного элемента с искомым значением, нет гарантии, какой элемент будет найден.

Если элемент с данным значением не найден, будет возвращено отрицательное число. Отрицательным числом будет индекс, по которому будет вставлен искомый элемент, а затем минус один. Посмотрите на этот пример:

Метод Arrays.binarySearch() для поиска части массива. Вот как это выглядит:

В этом примере выполняется поиск в массиве значения 2, но только между индексами 0 и 4 (без 4).

Эта версия binarySearch() работает так же, как и другая версия, за исключением случаев:

Таким образом, этот пример:

вернет -5, а не -7, как в двоичном поиске (целых, 12).

Проверка, равны ли массивы Arrays.equals()

Класс java.util.Arrays содержит набор методов, называемых equals(), которые можно использовать для проверки, равны ли два массива. Два массива считаются равными, если имеют одинаковую длину, а элементы равны друг другу в порядке их нахождения в массиве. Пример:

В этом примере сравнивается массив ints1 с массивами ints2 и ints3. Первое сравнение приведет к значению true, поскольку ints1 и ints2 содержат одинаковые элементы в одинаковом порядке. Второе сравнение приведет к значению false. Массив ints1 содержит те же элементы, что и ints3, но не в том же порядке. Поэтому два массива не считаются равными.

Читайте также: