2013-06-11 106 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代替。