2014-11-21 300 views
0

我一直在嘗試整天鍛鍊這個excersise,但沒有任何運氣。預先感謝您的幫助。Java讀取.txt文件到數組

這裏的問題

你要實現的方法是將每個整數存儲在數字陣列 ,每個數組元素一個數字。我們將使用長度爲50的數組 ,所以我們將能夠存儲多達50個數字的整數 長。我們必須小心如何存儲這些數字。例如,考慮 ,例如存儲數字38423和27.如果我們在 處存儲這些數組的「前面」,並且該數組的索引0中的每個數字的前導數字,那麼當我們將這些數字相加時, 我們可能會添加它們是這樣的:

爲了模擬值的這種向右移位,我們將每個值存儲爲 的整整50位的序列,但我們將允許號碼有 前導0。例如,上面的問題轉化爲:

現在列正確對齊,我們有足夠的空間在 前的情況下,我們甚至更長的號碼添加到這些。

程序的數據將被存儲在一個名爲sum.txt的文件中。 對於您要解決的問題,輸入文件的每一行都會有不同的添加問題。每行將有一個或多個整數加起來 。在這篇文章末尾看看輸入文件 和你應該產生的輸出。請注意,您爲每條輸入行生成一行 輸出行,顯示您在 正在解決的添加問題及其答案。您的輸出還應該在 末端指示處理了多少行輸入。您必須完全重現 此輸出。

您應該使用第6章中描述的技術來打開一個文件, 逐行讀取它,並處理每行的內容。在讀取這些數字的 中,您將無法將它們讀取爲整數或長整數 ,因爲它們中的很多都太大而無法以int或long存儲。所以 你必須使用方法 next()調用字符串值來讀取它們。那麼你的第一個任務就是將一串數字 轉換成一個50位數的數組。如上所述,您需要將 號碼向右移動,並在前面加上前導0。字符串 方法charAt和方法Character.getNumericValue將有助於 解決這部分問題。

您將要添加每行數字,這意味着您將有 編寫一些代碼,允許您將這兩個 數字相加或將其中一個添加到另一個。這是你在小學所學的東西,從右邊開始加上,保持 跟蹤是否有一個數字從一列到 。您的挑戰在於採取一個您熟悉的過程 ,並編寫執行相應任務的代碼。

你的程序也必須寫出這些數字。這樣做,它應該 不打印任何前導0。儘管 號碼在內部以前導0存儲是方便的,但讀取輸出的人將會看到 而不是任何前導0。

您可以假設輸入文件的數字有50個或更少的 數字,答案總是50位或更少。但是,請注意,您必須處理個人可能爲0或答案可能爲0的可能性。輸入文件中不會有負數 整數。

你應該使用長度恰好爲50位數字的數組來解決這個問題 長。某些錯誤可以通過將數組拉伸到像51位數字那樣的 來解決,但不應該這樣做,如果數組需要超過50位數字,則 會丟失樣式點。

的50位數的選擇是任意的(一個神奇的 數),所以你應該引入一個類常量您使用 貫穿,將可以很容易地修改代碼以 不同數量的操作數字。

將輸入文件看作是您的程序必須解決的問題類型的示例。我們可能會使用更復雜的輸入文件來進行實際的 分級。

Java類庫包含名爲BigInteger的類和使用類似於我們要求在此程序中實現的 的策略的BigDecimal。您無權使用BigInteger或BigDecimal解決此問題 。您必須使用數字 數組解決它。

您的程序應該存儲在名爲Sum.java的文件中。

輸入文件sum.txt

82384 
204 435 
22 31 12 
999 483 
28350 28345 39823 95689 234856 3482 55328 934803 
7849323789 22398496 8940 32489 859320 
729348690234239 542890432323 534322343298 
3948692348692348693486235 5834938349234856234863423 
999999999999999999999999 432432 58903 34 
82934 49802390432 8554389 4789432789 0 48372934287 
0 
0 0 0 
7482343 0 4879023 0 8943242 
3333333333 4723 3333333333 6642 3333333333 

輸出應該產生

82384 = 82384 
204 + 435 = 639 
22 + 31 + 12 = 65 
999 + 483 = 1482 
28350 + 28345 + 39823 + 95689 + 234856 + 3482 + 55328 + 934803 = 1420676 
7849323789 + 22398496 + 8940 + 32489 + 859320 = 7872623034 
729348690234239 + 542890432323 + 534322343298 = 730425903009860 
3948692348692348693486235 + 5834938349234856234863423 = 9783630697927204928349658 
999999999999999999999999 + 432432 + 58903 + 34 = 1000000000000000000491368 
82934 + 49802390432 + 8554389 + 4789432789 + 0 + 48372934287 = 102973394831 
0 = 0 
0 + 0 + 0 = 0 
7482343 + 0 + 4879023 + 0 + 8943242 = 21304608 
3333333333 + 4723 + 3333333333 + 6642 + 3333333333 = 10000011364 

總線= 14

我的代碼迄今

public class Sum { 

    public static void main(String args[]) throws FileNotFoundException{ 
     File file = new File("sum.txt"); 
     Scanner scanner = new Scanner(file); 
     String[] myInts = new String[50]; 
     int mySpot = 0; 
     while(scanner.hasNext()){ 
      myInts[mySpot] = scanner.next(); 
      mySpot++; 
     } 
     for(int i = 0; i < myInts.length; i++){  
     } 
     System.out.println(Character.getNumericValue(myInts[0])); 
     System.out.println(Arrays.toString(myInts)); 
    } 
} 
+0

你需要壓縮你的問題。人們會在沒有閱讀任何信息的情況下downvote – Sajidkhan 2014-11-21 01:26:42

+0

所有這些對於任務來說都很重要。 – SquidSquad 2014-11-21 01:28:06

+0

你的程序是否按照你期望的那樣做?程序運行時你認爲應該發生什麼?究竟發生了什麼?你爲什麼這麼認爲?從這個分析開始,然後讓你的問題更加精確。這樣,沒有人爲你工作就更容易得到答案。我建議你將問題分解爲一些非常簡單的問題,例如逐行讀入文本文件。首先解決。 – 2014-11-21 01:28:50

回答

0

提示#1:數組初始化爲0。這樣,當你處理文件,所有你所擔心的是,以取代從文件中獲得的數字的索引位置。

提示#2:你必須做一些重複除以10和模數運算從數字中提取數字(或者如果你喜歡二進制移位)。例如,要將數字從'27'分開,您可以執行27 % 10(7)和27/10(2)。這裏的關鍵是將結果存儲爲int。畢竟,每個數字都是一個整數(不是浮點數)。對於更大數量的數字,您需要丟棄過程數位,以使數字變小。當分部的商數等於零時,你現在就完成了。因此,你可以在僞代碼中說:DIVIDE數字由10 WHILE數字> 0(類似的東西)

提示#3,你將不得不迭代反向來存儲數組中的數字。如果數組的長度爲50,則以LENGTH-1開始,然後倒數至ZER0。如果問題允許,請使用ints的數組而不是Strings的數組。使用Integer.parseInt(String s)將數字字符串轉換爲原始文件int

0

我認爲這個問題說,讀取每個數字到一個不同的標準大小的數組,而你正在讀取所有單詞到一個相同的數組。而這也將是不錯的逐行處理此行

像這樣

Scanner scanner = new Scanner(file); 
    int[][] myInts = new int[wordSize][]; 
    int mySpot = 0; 
    while (scanner.hasNextLine()) { 
     Scanner scanner1 = new Scanner(scanner.nextLine()); 
     while (scanner1.hasNext()) { 
      String s = scanner1.next(); 

      int i; 
      for (i= 0; i < wordSize - s.length(); i++) { 
       myInts[i][mySpot] = 0; 
      } 
      i--; 
      for (int j=0;j < s.length(); i++,j++) { 
       myInts[i][mySpot] = Character.digit(s.charAt(i), 10); 
      } 
      mySpot++; 
     } 

     // do the additions here and add this line to output file 
    } 
0

當一切都失敗了閱讀使用說明:

「你是要實現的方法是存儲每個整數在數組數組中,每個數組元素使用一位數字,我們將使用長度爲50的數組,因此我們將能夠存儲長達50位數的整數。「

告訴我,這條線:

String[] myInts = new String[50];

有一些顯著的問題。

提示1:當它是一個String對象數組時,不要將其稱爲myInts。事情已經夠難了。提示2:瞭解new String[50]不會給你一個字符串大小爲50個字符。它將爲您提供空間來存儲對50個字符串對象的引用。提示3:瞭解每個輸入行可以單獨解決,因此不需要記住之前解決的任何行。

提示4:讀取一次在一個行成String line;

提示5:讀取線解決問題顯示在兩個部分後:左側和=的右側。

提示6:左側:用空格+空格替換空格顯示行。 line.replace(" "," + ");

提示7:右邊:使用line.split(" ")在空間上分割線,循環分割的字符串數組,每個這些字符串都是你將要轉換爲int數組的東西。

提示8:「將一串數字轉換爲一個50位數的數組」< - 如果您編寫了這樣的方法,生活會更容易。採取字符串。返回一個int []。 private int[] makeIntArray(String num)照顧這裏的「右移/前導零」問題。

提示9:int和long不足以容納更大的數字,因此在轉換爲int []之前將數字串拆分爲數字串。

提示10:讀Splitting words into letters in Java

提示11:讀Split string into array of character strings

提示12:一旦你有單個字符,你可以使用Integer.parseInt(singleCharString[index--])如果你打破它歸結爲一個字符串數組或Character.digit(chr[index--], 10);,如果你把它弄壞了直到一組字符。提示13:「編寫一些代碼,允許您將這些數字中的兩個相加,或者將其中的一個添加到另一箇中。」仔細閱讀,它告訴你,你真的需要宣佈兩個增值稅。 int[] sum = new sum[SIZE];int[] next = new next[SIZE];其中大小爲private final static int SIZE = 50;

提示14:增加兩個的這些INT []編號,以產生新的int []是另一個良好的時間作出的方法。 int[] sum(int[] op1, int[] op2)

提示15:因爲我們所有的int []都已經右移,並且總是50長,所以我在49開始一個循環並倒計時。 result[i-1] = (op1[i] + op2[i] + carry) % 10;carry = (op1[i] + op2[i] + carry)/10會派上用場。確保停止循環爲1或[i-1]將索引超出你的範圍。

提示16:再次測試,測試和測試。做小的改變然後測試。小變化,測試。不要只是打字和祈禱。使用調試器,如果你喜歡但個人我喜歡檢查這樣的值System.out.println("line: " + line);//TODO remove debugging code

+0

感謝所有的幫助, – SquidSquad 2014-11-21 03:49:55

+0

@SquidSquad如果答案是有用的考慮upvoting它。如果它幫助你考慮接受它。 – CandiedOrange 2014-11-21 11:16:14