2011-04-26 75 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