我接受这段代码:
while((line = bufferedReader.readLine()) != null) {
var[0]=line;
splitArray = var[0].toCharArray();
int j=0;
for (int i=0; i<sArray.length; i++) {
if (splitArray[i] != ',' && splitArray[i] != ' ') {
p[j] = Character.getNumericValue(sArray[i]);
j++;
}
columns = p[0];
rows = p[1];
}
break;
}
问题是如果行(p [1])是一个两位数字,例如11, 作为行,我得到值1,作为11的第一个数字。我可以做些什么来克服这个问题?
我可以使用其他功能,还是必须自定义“if”循环?
我将* .txt文件作为输入。
假设文本是9,11(9代表列,11代表行)。当我运行代码时,在列中正常运行数字9。但是当涉及行(编号11)时,p [1]值为1而不是11,因为它只写入两位数中的第一位。
答案 0 :(得分:1)
尝试使用var[0].split("[, ]")
这将生成字符串而不是单个字符,然后您可以解析它们以使它们成为数字类型。
答案 1 :(得分:0)
你的逻辑错误。您一次只能查看一个字符,因此,您只能获得一位数的值。假设您的行是9,11
,如您的示例所示。这将是您在splitArray
中获得的数组:
┌───┬───┬───┬───┐ │ 9 │ , │ 1 │ 1 │ └───┴───┴───┴───┘ 0 1 2 3
现在,在循环中,首先您的i
为0,而您的j
为0,因此您的数字为'9'
,而p[0]
中的数字为{{1} },并将j
设置为1。
然后,您将9
放入collumns
,将0
(我假设p[1]
的初始值)放入rows
。
接下来,您的i
为1。
下一个字符是','
。这是跳过的,但您仍然将值放入collumns
和rows
- 与之前的值相同。
接下来,您的i
为2。
如您所见,splitArray[2]
为'1'
。所以你得到它的数值并把它放到p[j]
。 j
目前为1
。因此p[1]
获得1
。并且 j
的值设置为2
同样,您将p[0]
(仍为9)的值放入collumns
,但现在p[1]
的值已更改,因此您将1
放入rows
。
接下来,您的i
为3
。
splitArray[3]
的值为'1'
- 它是'1'
的第二个11
。所以你得到它的数值 - 1 - 并把它放到p[j]
。但j
现在是2
。因此p[2]
的值变为1
。但你永远不会使用这个价值。
同样,你将p[0]
(仍然是9)的值放入collumns
,然后放置p[1]
的值(自上次迭代以来仍为1)进入rows
。
接下来,您的i
超出限制并完成循环。
所以你看,你的逻辑存在问题:
Character.getNumericValue()
以某种方式获得整个&#34; 11&#34;并转换它。但它只看一个角色。p[1]
中有&#34; 1&#34;你需要做p[1] = p[1]*10 + Character.getNumericValue(splitArray[i])
)之类的事情。这意味着如果您已经开始解析当前数字,则必须更改逻辑以便记住。这种逻辑被称为&#34;状态机&#34;。collumns
和rows
中的值放在循环中是错误的。如您所见,您在每个步骤中一次又一次地分配它们。您可以直接分配到collumns
和rows
,也可以完全避免使用p
,或者在完成解析后分配给collumns
和rows
并使用正确的p[0]
p[1]
和SerialNumber=ProductNumber
中的值。现在,在某些情况下执行状态机是一件好事,但是有更好的方法来分割字符串和解析数字。您可以使用尊敬的StringTokenizer
或使用String.split()
作为另一个答案告诉您。
然后,您将获得原始字符串的字符串部分。然后,您可以使用Integer.parseInt()
将其解析为数字。