2013-06-11 52 views
0

我只是想知道,你可以阅读纺织品,或者你必须将文本文件导入到Java(如字符串或数组列表)才能够使用文本文件中的信息。阅读与数组列表

比如我有一个类似于此

1 34 12 43 65 
1 44 8 45 77 
2 34 10 56 87 
6 43 6 76 89 
6 65 7 23 90 

其中每列下来表示对某事物的文件(可能列项是ID,列二是价格,而列三是一个月)。然后让我们说我有20gb的信息这种方式。我可以使用java来制作这些信息的数据摘要,还是仅仅是这个文件太大?我尝试导入20gb文件作为一个ArrayList,但等待10分钟和ArrayList仍填满后,我放弃了。

我在想,也许如果我可以直接与文件进行交互而不是将其作为数组列表导入它可能会工作。

+3

当然,您可以从Java文件中读取数据,而不仅仅是硬编码您的数字!查找“Java I/O”。 – dasblinkenlight

+2

'我'是变量,我是你。 – Maroun

+1

我的不好安德鲁汤普森。我实际上正在编辑它,因为你已经有了,所以无法提交我的更改。 Dashblinkenlight,我知道I/O。我使用scanner/filereader/bufferedreader来获取java文件。但之后,我该如何与程序交互(如价格= 2时搜索它)? – Danny

回答

1

您当然可以使用Java来总结这些信息。例如,如果你的目标是计算每列的最小值,最大值和平均值,你可能会写类似:

final BufferedReader br = 
    new BufferedReader(new FileReader("/this/is/the/path/to/the/file.txt")); 
final int[] mins = { Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 
        Integer.MAX_VALUE, Integer.MAX_VALUE }; 
final int[] maxes = { Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, 
         Integer.MIN_VALUE, Integer.MIN_VALUE }; 
final double[] sums = { 0.0, 0.0, 0.0, 0.0, 0.0 }; 
int count = 0; 
try { 
    String line; 
    while((line = br.readLine()) != null) { 
     ++count; 
     final String[] values = line.split("\\s+"); 
     for(int i = 0; i < 5; ++i) { 
      final int value = Integer.parseInt(values); 
      if(value < mins[i]) { 
       mins[i] = value; 
      } 
      if(value > maxes[i]) { 
       maxes[i] = value; 
      } 
      sums[i] += value; 
     } 
    } 
} finally { 
    br.close(); 
} 
final double[] averages = new double[sums.length]; 
for(int i = 0; i < sums.length; ++i) { 
    averages = sums[i]/count; 
} 
System.out.println(Arrays.toString(mins)); 
System.out.println(Arrays.toString(maxes)); 
System.out.println(Arrays.toString(averages)); 
+0

'final double [] sums'为什么在整数值时使用'double'? –

+0

@AndrewThompson:20G字节的整数值可能超出范围。 – ruakh

+0

我正在考虑使用'long',但是可以接受,因为'Double'将会比'long'拥有更大的值。 –

0

一个文件大会读一点基本的方法,过程量,从内存中清除细节,然后循环执行文件的其他部分,完成相同的操作。

我喜欢那个想法。只需阅读所有物品ID 1,即可获得该平均值,然后转到下一个物品ID。问题是我不知道该怎么做,也不知道有多少物品。

我不明白如果您只是想要为每列填充平均值,那么这是一个问题。有5列,因此保留5个属性(例如long columnTotal1 .. columnTotal5)。将每行的值添加到相应的列总数并增加lineCount

在文件末尾,将每列的列总数除以行数以获得该列的平均值。

  1. 正如指出的那样,一个long可能不是大到足以容纳的总和,所以这个问题可能需要BigInteger代替。