Чтение неизвестного количества элементов из файла в массив?

#java

#java

Вопрос:

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

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

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

1. Ваша ситуация — это именно то, что ArrayList нужно. Просто преобразуйте его в массив после завершения чтения (если по какой-то причине вам не нравится list).

2. профессор хочет, чтобы мы избегали использования того, чему она не учила Профессор рассказал вам о java.util.ArrayList классе?

Ответ №1:

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

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

РЕДАКТИРОВАТЬ: существует третий способ, который доступен только в том случае, если каждая запись в файле имеет фиксированную ширину, а файл не сжат (или не закодирован каким-либо другим способом, который мог бы повлиять на макет содержимого): получаем размер файла, делим на размер записи, и всесколько именно записей вам нужно выделить. К сожалению, жизнь не всегда так проста. 🙂

Ответ №2:

Поскольку вы не упомянули, что ваш профессор преподавал ArrayList или нет, в этом случае я бы пошел ArrayList наверняка. Единственная цель f ArrayList — иметь дело с такого рода ситуациями. Такие функции, как динамическая память, дают ArrayList некоторые преимущества перед массивом.

Вы можете сначала посчитать, а затем соответствующим образом создать массив. Но это будет медленно, и зачем изобретать велосипед?

Итак, ваш подход должен заключаться в использовании ArrayList чтения элемента и просто использовании ArrayList.add()