Character.getNumericValue()的问题

时间:2015-05-08 12:32:49

标签: java

我接受这段代码:

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,因为它只写入两位数中的第一位。

2 个答案:

答案 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。

下一个字符是','。这是跳过的,但您仍然将值放入collumnsrows - 与之前的值相同。

接下来,您的i为2。

如您所见,splitArray[2]'1'。所以你得到它的数值并把它放到p[j]j目前为1。因此p[1]获得1。并且 j的值设置为2

同样,您将p[0](仍为9)的值放入collumns,但现在p[1]的值已更改,因此您将1放入rows

接下来,您的i3

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;并转换它。但它只看一个角色。
  • 如果您使用它,则必须进行自己的计算(将现有数字乘以10,添加当前数字的值。因此,如果我们在p[1]中有&#34; 1&#34;你需要做p[1] = p[1]*10 + Character.getNumericValue(splitArray[i]))之类的事情。这意味着如果您已经开始解析当前数字,则必须更改逻辑以便记住。这种逻辑被称为&#34;状态机&#34;。
  • 此外,将collumnsrows 中的值放在循环中是错误的。如您所见,您在每个步骤中一次又一次地分配它们。您可以直接分配到collumnsrows,也可以完全避免使用p,或者在完成解析后分配给collumnsrows并使用正确的p[0] p[1]SerialNumber=ProductNumber 中的值。

现在,在某些情况下执行状态机是一件好事,但是有更好的方法来分割字符串和解析数字。您可以使用尊敬的StringTokenizer或使用String.split()作为另一个答案告诉您。

然后,您将获得原始字符串的字符串部分。然后,您可以使用Integer.parseInt()将其解析为数字。