Java-在不知道大小的情况下从txt文件填充长数组?

Java-在不知道大小的情况下从txt文件填充长数组?,java,arrays,file,Java,Arrays,File,我试图通过读取一个文件来填充一个长数字的数字数组(以及一个相同数字的临时数组)。该文件大约有32000行不同的长数字(每行一个)。我的教授提供的代码如下所示: public static void main(String[] args) throws FileNotFoundException { Scanner in = new Scanner(new File("longNumbers.txt")); Long [] numbers; Long [] temp;

我试图通过读取一个文件来填充一个长数字的数字数组(以及一个相同数字的临时数组)。该文件大约有32000行不同的长数字(每行一个)。我的教授提供的代码如下所示:

public static void main(String[] args) throws FileNotFoundException {

    Scanner in = new Scanner(new File("longNumbers.txt"));
    Long [] numbers;
    Long [] temp;
    Long startTime, endTime;

    while(in.hasNext()) {
        //TODO:  populate numbers and temp arrays

    }

在所提供的while循环中完成隐含的工作。我的问题是:数组的大小不是固定的吗?如果我们在填充数组之前没有扫描每一行,我们如何知道数组的大小?在检查每一行时,我对如何填充/实例化这两个数组感到非常困惑。

您可以使用动态大小的数组
ArrayList
基本上是数组上的包装器,当您试图写越界时,它负责调整大小和复制数组。如果不知道粗略的估计,并且进行了太多的重新调整大小,则会产生重新创建数组和复制元素的成本


LinkedList
此处

您可以使用动态大小的数组
ArrayList
基本上是数组上的包装器,当您试图写越界时,它负责调整大小和复制数组。如果不知道粗略的估计,并且进行了太多的重新调整大小,则会产生重新创建数组和复制元素的成本


或者
LinkedList
此处

您可以使用ArrayList在循环中尝试
in.nextLong()
,然后创建一个具有“ArrayList”大小的数组(如果您确实需要):

ArrayList number=new ArrayList();
while(在.hasNext()中){
add(in.nextLong());
}
long[]numberArray=numbers.toArray(新的long[numbers.size());
//将ArrayList中的所有数字放入数组

您可以使用ArrayList在循环中尝试
in.nextLong()
,然后创建一个与“ArrayList”大小相同的数组(如果您确实需要):

ArrayList number=new ArrayList();
while(在.hasNext()中){
add(in.nextLong());
}
long[]numberArray=numbers.toArray(新的long[numbers.size());
//将ArrayList中的所有数字放入数组

我想你的导师也谈到了如何调整数组的大小。 下面是一个简短的刷新:

int INIT_SIZE = 10
int[] array = new int[INIT_SIZE];
i = 0
while(condition)
{
    array[i++] = nextInt();
    if(i == array.length)    
         array = Arrays.copyOf(array, 0, array.length + (array.length / 2));
}
通常的解决方案是将数组的大小增加一半


既然您知道了如何调整int数组的大小,那么调整Long数组的大小就很容易了。

我想您的讲师也谈到了如何调整数组的大小。 下面是一个简短的刷新:

int INIT_SIZE = 10
int[] array = new int[INIT_SIZE];
i = 0
while(condition)
{
    array[i++] = nextInt();
    if(i == array.length)    
         array = Arrays.copyOf(array, 0, array.length + (array.length / 2));
}
通常的解决方案是将数组的大小增加一半


既然您知道了如何调整int数组的大小,那么调整Long数组的大小就很容易了。

使用ArrayList或其他需要可变大小的数组列表。您可以先构建
列表
,然后再将其转换为数组。其他选择是以某种方式使用新的流(没有对它们进行过太多的研究)@GarrettMcClure然后您需要预先分配大量内存,或者执行ArrayList所做的操作,并在阵列满后手动重新分配。ArrayList类和其他抽象存在是有原因的。在许多情况下,手动处理数组可能是一件痛苦的事情。您刚刚意识到,您也可以先查看文件,计算出它有多少行长,然后使用这些信息来知道要分配多少插槽。显然,您正在寻找使用提供的代码的解决方案。可能的解决方案:初始化数字[]到某个大小::完全初始化时将临时值初始化为数字。长度::从数字复制到临时值::将数字重新初始化为旧大小+x::从临时值复制回来::继续迭代。使用ArrayList或其他需要可变大小的列表。您可以首先构造
列表
,然后将其转换为数组。其他选择是以某种方式使用新的流(没有对它们进行过太多的研究)@GarrettMcClure然后您需要预先分配大量内存,或者执行ArrayList所做的操作,并在阵列满后手动重新分配。ArrayList类和其他抽象存在是有原因的。在许多情况下,手动处理数组可能是一件痛苦的事情。您刚刚意识到,您也可以先查看文件,计算出它有多少行长,然后使用这些信息来知道要分配多少插槽。显然,您正在寻找使用提供的代码的解决方案。可能的解决方案:将数字[]初始化为某个大小::完全初始化时将临时值初始化为数字。长度::从数字复制到临时值::将数字重新初始化为旧大小+x::从临时值复制回来::继续迭代。我非常确定我们只使用数组,因为这是我的讲师提供的。否则,我会立即切换到ArrayList。我想你的教授希望你提出
ArrayList
实现,或者另一种方法是在你的文件中迭代2次。我很确定我们只使用数组,因为这是我的导师提供的。否则,我会立即切换到ArrayList。我认为您的教授希望您提出
ArrayList
实现,或者另一种方法是对您的文件进行两次迭代。