java文件逐行加载对象时如何用array代替arraylist

qvk1mo1f  于 2021-07-03  发布在  Java
关注(0)|答案(6)|浏览(363)

(家庭作业:)在这种情况下,我想使用array而不是arraylist。我有arraylist名称employee,我必须将它的数据插入到树中。我从文件中逐行加载数据。但是我想对employee使用array,而不是arraylist。我该怎么做?在这种情况下,有任何方法可以使用array而不是arraylist。下面的代码是我的arraylist employee示例代码。我想将list改为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;
}
kzipqqlq

kzipqqlq1#

不给你任何代码(你自己做;-):
分析文件两次:
获取行数,根据行数创建数组
再次解析文件,填充数组
一些研究(关键词bufferedreader和array)也会对你有所帮助。

y53ybaqx

y53ybaqx2#

这种方法不是最好的,但可能会解决您的问题。用于<8的java版本。方法是解析文件以获得行数,创建employee数组,然后再次解析以获得所有单个employee的数据

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;
}
daolsyd0

daolsyd03#

您的要求不清楚在以下情况下您想做什么:
一行解析失败;
无法打开文件进行读取。
以下是一个解决方案(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;
        }
    }
}

注意这个解决方案如何完全不使用中间列表;相反,它使用了Java8流api。
剩下要做的就是处理错误。。。这由你决定:)

p5fdfcr1

p5fdfcr14#

猜测数组的大小,例如取文件的大小除以20(大约是您给出的示例中的行的大小)。然后读入数组,数行。如果在到达文件结尾之前数组已满,请分配一个大小为原来两倍的新数组,将旧数组中的所有内容复制到新数组中,然后用新数组替换旧数组,并以相同的方式继续操作,直到完成为止。您可以查看arraylist的源代码,看看它是如何完成的—基本上这就是arraylist在内部所做的。

6tdlim6h

6tdlim6h5#

如果要将arraylist转换为array,请使用以下代码:

Employee [] arrayOfEmpolyees = new Employee[employees.size()]
employees.toArray(arrayOfEmpolyees);
z4bn682m

z4bn682m6#

这就像是倒退了一步。java集合(例如list接口和arraylist实现)与“普通的旧”数组相比有许多优点。
阵列的唯一真正优势是减少了开销——但这只有在处理数百万或数十亿存储在容器中的事物时才是重要的。
所以真正的答案是:不要那样做。继续使用list/arraylist。
但如果您坚持这样做,那么您当然可以使用数组—但是您必须添加使arraylist更方便的部分:您必须提供代码,以便在达到数组大小限制时动态地“增长”数组。工作原理如下:
例如,从大小为100的初始数组开始
填充该数组时,可以跟踪“正在使用”的插槽数
当您的代码想要添加第101个元素时,您可以“增长”数组
成长作品作者:
创建一个新的数组,其容量类似于currentarray.length+100
使用system.arraycopy()将所有条目从旧数组移动到新数组

相关问题