Java字符串转换为整数

3

我有一个包含大约150个数字的字符串,例如String num = "64513246563........";

我的目标是将该字符串中每个数字相加。所以我的想法是将其拆分为int数组并从那里进行相加。我首先将其分割成一个字符串数组,然后尝试将其转换为int数组,但是我遇到了未知来源错误。以下是代码:

String[] strArray = num.split("");
int[] intArray = new int[strArray.length];
        for(int i = 0; i < strArray.length; i++) {
           intArray[i] = Integer.parseInt(strArray[i]);
           } 

以下是错误信息:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)

有人能看出我做错了什么吗?或者还有更高效的方法吗?

////////////////////////////////

感谢大家的帮助,似乎使用 .split("") 将字符串拆分会在索引0处创建一个空字符串。这是我的主要问题,但是有很多有用的提示可以更有效地解决问题 :) 感谢大家的意见。


在循环的每次迭代中打印strArray[i]并查看其输出。 - Osiris
8个回答

8

num.split("")给出的第一个字符串是空的。

一个解决方案是从索引1开始迭代。

但你所做的太过昂贵,你可以这样做:

    String num = "64513246563";
    for(int i = 0; i < num.length(); i++) {
         int digit = num.charAt(i)-'0';
         ... // use the digit, perhaps adding it
    } 

2
展示空字符串最初存在的原因,给个“+1”。 - Mike Christensen
没错,我不确定为什么会得到一个空字符串。谢谢你的解释和加一。 - shanahobo86
@shanahobo86 如果这不仅仅是为了学习,我强烈建议你不要构建中间数组和所有那些你解析的字符串。这样非常浪费资源。 - Denys Séguret

5
int sum = 0;
for (int i = 0; i < string.length(); i++) {
    sum += Character.getNumericValue(string.charAt(i));
}

你需要使用 num.length() 而不是 num.length - Ted Hopp
你改得真快 :P 但是你先写的是 Integer.parseInt(num.charAt(i)) - Martijn Courteaux
@MartijnCourteaux 我在回答时就知道了,所以我立即进行了更改 :) - user219882
谢谢Tomas,这就是我最终用来解决问题的方法 :) - shanahobo86

3
java.lang.NumberFormatException: For input string: ""

异常信息清楚地告诉我们输入是空字符串。

处理这种情况的方法之一是,在解析之前检查空的String

 for(int i = 0; i < strArray.length(); i++) {
           if(strArray[i] != null && !"".equals(strArray[i])
              {
               int q = Integer.parseInt(strArray[i]);
              }
           } 

注意:如果输入不是有效的整数,则仍将失败,但在空字符串(或)null的情况下不会失败。
处理这个问题的另一种方法是获取charAt(i)而不是使用split("")

太好了,谢谢你的帮助。我不确定字符串怎么会为空,但这个方法确实解决了这个问题。非常感激。 - shanahobo86
@shanahobo86,你可以从1开始而不是零来检查我的答案。 - someone
@shanahobo86 注意,使用这种方法,您的数组中的第0个元素将为0。 - James Montagne

2
String num="12234";
        String[] numarr = num.split("");
        System.out.println(numarr.length);

当你使用 "" 分割字符串时,会在零索引处产生一个空字符串。因此,你得到的数组应该是:
{"", "1", "2", "2", "3", "4"}

测试一下,上面返回的长度为6。因此Integer.parseInt("")会导致NumberFormatException异常。

测试:

String num="12234";
        String[] numarr = num.split("");
        for(String s: numarr){
            if(s.equals("")){
                System.out.println("empty string");
            }
            else {
                System.out.println(s);
            }

输出:

empty string
1
2
2
3
4

因此,在索引0处存在一个emptyString。
因此,在解析之前,您将不得不检查字符串是否为空字符串:
String[] strArray = num.split("");
int[] intArray = new int[strArray.length];
        for(int i = 0; i < strArray.length; i++) {
           if(!strArray[i].equals(""))
           intArray[i] = Integer.parseInt(strArray[i]);
           } 

感谢您的详细解释。我不会再犯同样的错误了:) +1 - shanahobo86

1
char[] charArray = num.toCharArray();

for(char c : charArray) {
    int q = Integer.parseInt("" + c);
} 

0
for(int i=0; i<yourString.length; i++) {
    yourIntegers[i] = Integer.parseInt(yourString.charAt(i).ToString());
}

0
我会简单地沿着字符串步进,解析每个数字:
int sum = 0;
for (int i = 0; i < num.length(); ++i) {
    sum += Integer.parseInt(num.substring(i, i + 1));
}

0

由于数组从空字符串开始,因此在for循环中要跳过第一个元素,因此请从1开始使用i

for(int i = 1; i < strArray.length; i++)

1
这个回答可以更好地加上解释。 - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接