(Домашнее задание :) Я хочу использовать массив вместо arraylist в этой ситуации. У меня есть имя сотрудника Arraylist, и я должен вставить данные в дерево. Я загружаю данные построчно из файла. Но я хочу использовать массив для Employee, а не arraylist. Как я могу это сделать ? В этой ситуации есть любые способы использовать массив вместо arraylist. Следующий код - мой пример кода для сотрудника arraylist. Я хочу изменить список на Employee [], как я могу написать следующую функцию в стиле массива.
public static void main(String[] args) {
List<Employee> employees = read("employees.txt");
BST bst = new BST();
for(Employee e : employees){
bst.insert(e);
}
}
public static List<Employee> read(String file) {
try {
List<Employee> employees = new ArrayList<>();
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while((line = reader.readLine()) != null ){
String[] arr = line.split("-");
Employee emp = new Employee();
emp.ccode = Integer.parseInt(arr[0]);
emp.cus_name = arr[1];
emp.phone = arr[2];
employees.add(emp);
}
return employees;
} catch (IOException ex) {
Logger.getLogger(TestMusic.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
5 ответов
Этот подход не самый лучший, но может решить вашу проблему. будет использоваться для версий Java <8. Подход заключается в том, чтобы проанализировать файл, чтобы получить нет. строк, чтобы создать массив сотрудников, и снова проанализировать, чтобы получить данные всех отдельных сотрудников
public static void main(String[] args) {
int empSize = getNumberOfEmployees("employees.txt");
employees = new Employee[empSize];
employees = read("employees.txt");
BST bst = new BST();
for(Employee e : employees){
bst.insert(e);
}
}
public static int getNumberOfEmployees (String file) {
int totalEmp = 0;
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while((line = reader.readLine()) != null ) {
totalEmp ++;
}
}catch (IOException e) {
e.printStackTrace();
}
return totalEmp;
}
public static Employee[] read(String file) {
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
int i=0;
while((line = reader.readLine()) != null ){
String[] arr = line.split("-");
Employee emp = new Employee();
emp.ccode = Integer.parseInt(arr[0]);
emp.cus_name = arr[1];
emp.phone = arr[2];
employees[i] = emp;
i++;
}
return employees;
} catch (IOException ex) {
Logger.getLogger(TestMusic.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
Не давая вам никакого кода (сделайте это самостоятельно ;-)):
Разобрать файл дважды:
получить количество строк, создать массив на основе количества строк
снова разбери файл, заполни массив
И некоторые исследования (ключевые слова BufferedReader и Array) тоже вам помогут.
Из ваших требований неясно, что вы хотите сделать в следующих ситуациях:
- одна строка не может разобрать;
- не могу открыть файл для чтения.
Вот решение, которое (eww) будет просто игнорировать непарсируемые записи и возвращать пустой массив, если файл не может быть проанализирован:
public final class TestMusic
{
private static final Employee[] NO_EMPLOYEES = new Employee[0];
public static void main(final String... args)
{
final BST bst = new BST();
for (final Employee emp: getArray())
bst.insert(emp);
}
private static Employee toEmployee(final String input)
{
final String[] arr = input.split["-"];
final Employee emp = new Employee();
try {
emp.ccode = Integer.parseInt(arr[0]);
emp.cus_name = arr[1];
emp.phone = arr[2];
return emp;
} catch (NumberFormatException | IndexOutOfBoundsException e) {
return null;
}
}
private static Employee[] getArray()
{
final Path path = Paths.get("employees.txt");
try (
Stream<String> lines = Files.lines(path);
) {
return lines.map(TestMusic::toEmployee)
.filter(Objects::nonNull)
.toArray(Employee[]::new);
} catch (IOException ignored) {
return NO_EMPLOYEES;
}
}
}
Обратите внимание, что это решение вообще не использует промежуточный список; вместо этого он использует Java 8 Stream API.
Что осталось сделать здесь, так это обработать ошибки ... Это решать вам :)
Если вы хотите преобразовать ArrayList в массив, используйте следующий код:
Employee [] arrayOfEmpolyees = new Employee[employees.size()]
employees.toArray(arrayOfEmpolyees);
Угадайте размер массива, например, взяв размер файла и разделив его на 20 (приблизительно размер строки в приведенном вами примере). Затем читайте в массив, считая строки. Если массив заполнен до того, как вы достигли конца файла, выделите новый массив в два раза больше, скопируйте все из старого массива в новый массив, замените старый массив новым массивом и продолжайте в том же духе, пока не закончите. Вы можете посмотреть на источник ArrayList, чтобы увидеть пример того, как это делается - в основном это то, что ArrayList делает внутри.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].