Java 将TXT中的整数升序到数组

Java 将TXT中的整数升序到数组,java,arrays,inputstream,combinatorics,capacity-planning,Java,Arrays,Inputstream,Combinatorics,Capacity Planning,我的问题是将包含无符号整数且不重复的大型文本文件(UTF-8-1byte(ANSI))按升序放入数组中。快速的 所以我想说: while(scan.hasNextInt()) x.add(scan.nextInt()); 但是,无论我使用的是ArrayList、Vectors还是包含数百万个整数的文件的普通数组,最好确定所需的最大容量,以避免以后增加数组大小 使用File.length()我将获得文件中的位数+换行数 在最坏的情况下,它将从0开始,并且在每行中仅增加1。 我认为最大容量是可以用

我的问题是将包含无符号整数且不重复的大型文本文件(UTF-8-1byte(ANSI))按升序放入数组中。快速的 所以我想说:

while(scan.hasNextInt()) x.add(scan.nextInt());
但是,无论我使用的是ArrayList、Vectors还是包含数百万个整数的文件的普通数组,最好确定所需的最大容量,以避免以后增加数组大小

使用File.length()我将获得文件中的位数+换行数

在最坏的情况下,它将从0开始,并且在每行中仅增加1。
我认为最大容量是可以用组合数学来计算的,但我已经走到了死胡同。较小的数字不会被零(002)填充这一事实不知怎的让我很反感

考虑到第一个Int的大小,我想我们也可以更接近实际值

所以我最重要的问题是计算一个近似的[O(1)]所需的最大容量

此外,考虑到这个相当独特的问题,我在问自己scan.hasnetint()和scan.nextInt()是否是最快的,通过线程进行并行化是否可以进一步加快进程(考虑到从硬盘读取的功能可能不是这样)

问候
Halo

假设只有一个字节用于分隔两个数字(例如a'\n')

  • 10个数字,1位->20字节
  • 90个数字,2位->270字节
  • 900个3位数数字->3600字节
  • 。。。你明白了吗

如果您的文件大小现在是1000字节,那么您可以拥有的最大值是10个1位数,90个2位数,剩下710字节用于3位数。710/4=177.5,最多10+90+177=277个数字。

老实说,我不担心。首先,您可能会受到I/O带宽的限制。请先尝试简单的方法。除非发现问题,否则不要进行优化。如果存储的是
Integer
s而不是
int
s,那么如果使用
ArrayList
Vector
将其存储在
int[]
计算此集合的最佳初始容量是浪费时间。为数值的numver(不需要非常尖锐)找到一个upperbou8nd,然后使用
int[]
。这对我来说不是一个选项。@MrSmith42 int[]也是我的首选。这看起来是对数的。有没有更快的方法?我喜欢O(1)^@HaloCamper:例如,您可以通过查找表实现O(1)。另外,考虑到每个文件需要做一次;谁在乎它的复杂性是什么?坦白说,我认为这不重要。此计算的O(logn)工作量远小于读取数字所需的O(n)。