#java
#java
Вопрос:
Как указано в названии, я пытаюсь прочитать неизвестное количество элементов из файла в массив. Какой самый простой (профессор хочет, чтобы мы избегали использования того, чему она не учила), но эффективный способ сделать это?
Я думал о чтении и подсчете элементов в файле один за другим, затем создать массив после того, как я знаю, какой размер его сделать, а затем фактически сохранить элементы там. Но это кажется немного неэффективным. Есть ли лучший способ?
Комментарии:
1. Ваша ситуация — это именно то, что
ArrayList
нужно. Просто преобразуйте его в массив после завершения чтения (если по какой-то причине вам не нравится list).2. профессор хочет, чтобы мы избегали использования того, чему она не учила Профессор рассказал вам о
java.util.ArrayList
классе?
Ответ №1:
Есть только два способа сделать это: предложенный вами способ (подсчитать, затем прочитать) и создать массив и надеяться, что он достаточно хорош, а затем изменить размер, если это не так (что проще из двух, так ArrayList
как это происходит автоматически для вас).
Что лучше, зависит от того, ограничены ли вы временем или памятью (как правило, чтение файла дважды будет медленнее, чем перераспределение массива даже несколько раз).
РЕДАКТИРОВАТЬ: существует третий способ, который доступен только в том случае, если каждая запись в файле имеет фиксированную ширину, а файл не сжат (или не закодирован каким-либо другим способом, который мог бы повлиять на макет содержимого): получаем размер файла, делим на размер записи, и всесколько именно записей вам нужно выделить. К сожалению, жизнь не всегда так проста. 🙂
Ответ №2:
Поскольку вы не упомянули, что ваш профессор преподавал ArrayList
или нет, в этом случае я бы пошел ArrayList
наверняка. Единственная цель f ArrayList
— иметь дело с такого рода ситуациями. Такие функции, как динамическая память, дают ArrayList
некоторые преимущества перед массивом.
Вы можете сначала посчитать, а затем соответствующим образом создать массив. Но это будет медленно, и зачем изобретать велосипед?
Итак, ваш подход должен заключаться в использовании ArrayList
чтения элемента и просто использовании ArrayList.add()
…