2011-04-26 74 views
0

我遇到了一個問題,需要從文件(sums.txt)中讀取數據,該文件中包含以下幾行內容: 「204 435 28350 28345 39823 95689 234856 3482 55328「Java - 從文件添加陣列數字

我需要讀取每一位數字數據作爲標記,將每個標記分解爲一個數組,然後將每行中的所有標記添加到一起。 然而,具體而言,它需要像人類數學一樣添加。 實施例:

[0][0][0][0][0][0][0][1][3][2] 
[0][0][0][0][0][0][0][0][4][9] 
[0][0][0][0][0][0][6][3][4][1] 
------------------------------ 
         6,522 

它增加了2 + 9 + 1得到12,滴2倒,攜帶1 ..老派,非常非計算機種加入。

我不知道如何接近它。我知道我必須分解每一個,但我不明白這個過程的實際功能。

備註: - 其中一些數字最多爲25位數字,BigDecimal和BigInt不允許使用。

+1

你確定你已經完全理解了這個任務嗎?這是一個初學者的Java練習? – travega 2011-04-26 00:24:59

+0

這是一個開始的java類,是的。我瞭解基本的Java功能,但它是以「列形式」添加到我的。 – Arman 2011-04-26 00:31:50

+0

提示是測試我們移除零,將字符串轉換爲數組,從給定文件讀取數據並處理數組。我不能說這是測試這個最實際或最有用的程序,但它是分配的。 – Arman 2011-04-26 00:37:15

回答

0

你最好的選擇是以不同的順序執行你的操作。糾正我,如果我錯了,但你正在試圖做的可以分解成三個目標是什麼:

  1. 閱讀在數字從一個文件,一行行
  2. 獲得所有數字的總和上的線
  3. 轉換的所有數字在讀入數據結構,其中每個數字使用Reader類如BufferedReader作爲數組元素

流中的一個的行中存在一個。現在獲得每行上的數字總和,之前將數字分解成新的數據結構。

將每個令牌分解爲數組數組可能最好通過創建一個新的對象來實現,該對象接受一個整數並將其作爲一個整數數組存儲在對象中。

+0

@Trokka Woops,剛剛看到你的評論,所以你被告知以特定的順序執行這些操作,是嗎? – Legs 2011-04-26 00:39:43

+0

總和必須通過將每個令牌添加到一起,然後將令牌分解爲數組以便以邏輯列格式訪問,這意味着這種接近計算機添加的反向方式是我們必須如何獲得總和;我們不能使用適當的Java數學將所有行加在一起。 – Arman 2011-04-26 00:42:50

0

這一定是某種功課問題...

我想接近它類似於您所繪製它上面的方式的方式。從文件中讀取一行,然後根據您試圖計算的列,通過執行10次冪的重複mod/division來將該數字分成幾個,幾十個等等。這會讓你每個數字進入數組。例如,如果你想知道數字在100位的位置,你首先要做6522 mod 1000/100,並且你得到5,那麼用6522就可以了。同樣,對於任何特定的列。

將所有數字拆分爲數組後,必須從右向左迭代每列。在列中添加數字,然後跟蹤可以通過分割計算的「carry」。

您的結果大概會存儲在一個類似的數組中,您可以通過將每列乘以Y來將其轉換回實數:Yx * 10^x,其中x是Y0爲最右列的列數。希望有所幫助。

+0

絕對是一個功課問題。 要像你說的那樣訪問數百個6522,我不能分解每個令牌,然後逐字讀取它,例如讀取字符串的數值,只讀取第二個字符(或for循環中的x'st字符)。我的問題是,就代碼組織而言,我無法弄清楚如何在Java中編寫代碼以從令牌轉移到像這樣分解的數組,然後將其全部以這種方式添加。 但是,進位變量是一個巨大的幫助。 – Arman 2011-04-26 00:52:12

0

你可能會想在一個二維數組來保存你的號碼,聲明如下:

int[][] myArray = new int[height][width]; 

然後,你要在閱讀它們,就像這樣: (每個號碼最多以n ...)

String s = myTokenizer.nextToken(); 
int temp = Integer.parseInt(s); 
int counter = 0; 
while(temp>0){ 
     myArray[n][width-i] = temp%10; 
     i++; 
     temp/=10; 
} 

然後,你會想要添加它們。首先,聲明一個「反」變量:

int counter=0; 

然後,開始通過每列循環,併爲每個m列:

for(int i=0;i<height;i++){ 
     counter+=myArray[i][m]; 
} 
myFinalArray[m] = counter%10; 
counter/=10; 

大功告成,除非你是滿溢。

看來你想完全使用字符串。好的。

所以,你可以有n字符串完全由數字字符,是嗎?

讓我們把它們放到一個字符串數組中。

String[] myNumbers = new String[n]; 

現在,我們可以直接進行添加。對於每一個字符串,我們從同一個地方(相對於小數點)取一個字符。然後,因爲char實際上可以像整數一樣添加在一起,所以我們看一下ASCII表:0由值48表示,1由49表示,依此類推。所以我們只需從char中減去48即可得到相應的int。使用這一切:

for(int place=0;;place++){ 
     for(int i=0;i<n;i++){ 
      if(myNumbers[n].length()>=i) 
       count+=myNumbers[n].charAt(myNumbers[n].length()-i) - 48; 
     } 
     myFinalString = (String)(count%10) + myFinalString; 
     count/=10; 
} 

這應該比,也就是說n小工作,10 。

+0

這真的很有幫助。但是,令牌最多可達25位數字(9,223,372,036,854,775,807是其中一個數字),我們不允許使用BigDecimal或BigInteger。也許這就是我無法表達的對我來說最大的問題。如何將一個你不能作爲傳統號碼訪問的號碼存儲起來,並將其存儲在一個25槽的陣列中。 – Arman 2011-04-26 01:04:10

+0

我可以提供或澄清哪些其他信息以提供幫助?在這裏尋求幫助真是我唯一的幫助,教授拒絕幫助實驗室的學生。 – Arman 2011-04-26 01:22:15

+0

請注意,不是從右向左(長排中的「-i」),我們可以將字符串翻轉並從左向右移動。至少,這樣讀起來會更容易。 – bdares 2011-04-26 01:40:49