2014-11-21 303 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