(Домашнее задание :) Я хочу использовать массив вместо 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;
}
0
T3King 4 Сен 2017 в 10:49

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;
}
1
Urvashi Soni 4 Сен 2017 в 08:25

Не давая вам никакого кода (сделайте это самостоятельно ;-)):

Разобрать файл дважды:

  1. получить количество строк, создать массив на основе количества строк

  2. снова разбери файл, заполни массив

И некоторые исследования (ключевые слова BufferedReader и Array) тоже вам помогут.

1
Maia 4 Сен 2017 в 07:59

Из ваших требований неясно, что вы хотите сделать в следующих ситуациях:

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

Вот решение, которое (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.

Что осталось сделать здесь, так это обработать ошибки ... Это решать вам :)

1
fge 4 Сен 2017 в 08:14

Если вы хотите преобразовать ArrayList в массив, используйте следующий код:

Employee [] arrayOfEmpolyees = new Employee[employees.size()]
employees.toArray(arrayOfEmpolyees);
0
Maged Saeed 4 Сен 2017 в 07:56

Угадайте размер массива, например, взяв размер файла и разделив его на 20 (приблизительно размер строки в приведенном вами примере). Затем читайте в массив, считая строки. Если массив заполнен до того, как вы достигли конца файла, выделите новый массив в два раза больше, скопируйте все из старого массива в новый массив, замените старый массив новым массивом и продолжайте в том же духе, пока не закончите. Вы можете посмотреть на источник ArrayList, чтобы увидеть пример того, как это делается - в основном это то, что ArrayList делает внутри.

0
Jonathan Rosenne 4 Сен 2017 в 08:05