如何将一个字符串数组转换为整数数组?

4

我是Java编程的新手,但在浏览了这个网站后,我相当确定这应该能够运行。

 public static int[] ArrayStringToArrayInt(String[] arrayString) {
    int[] arrayInt = new int[arrayString.length]; //Array of Ints for output

    for (int i = 0; i <= arrayString.length; i++ ) {  //Run through the 
    arrayInt[i] = Integer.parseInt(arrayString[i]);   //array, Parsing each
    }                                                 //item into an int

    return arrayInt;
}

我希望这个方法能够接受一个输入数组:["1","2","3"],其中每个项目都是一个字符串,并返回[1,2,3],其中每个项目都是整数。

我将使用以下代码调用该方法:

int[] toBeSorted = ArrayStringToArrayInt(inputStringArray);

在这种情况下,toBeSorted 在此处同时被声明和初始化。
每当我尝试运行这个程序时,都会出现以下错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at sorter.Sorter.ArrayStringToArrayInt(Sorter.java:31)
at sorter.Sorter.main(Sorter.java:22)   
Java Result: 1

第31行是我的For循环的主体,也就是解析的部分,而第22行则是调用该方法的地方。

我需要这样做的原因是因为我想从用户那里获取输入(使用Scanner类),并希望他们能够同时输入许多数字。然后,我使用定界符模式将输入转换为一个数组。虽然这似乎没问题,但我只能想到如何使输入成为字符串数组,而不是int数组,这就是我的问题所在。

所以,我想问的是: 1)为什么我的代码不起作用? 2)有没有比这更简单的方法来获取用户的输入,并将其转换为int数组?

对于那些想看到我的整个代码的人,这是它的代码:

中间部分的test变量和两个数字的添加只是我测试代码是否工作的一种方式。它应该显示您输入的列表中的前两个数字相加的结果。

package sorter;

import java.util.Scanner;
import java.util.Arrays;

public class Sorter {

public static void main(String[] args) {

    Scanner userInput = new Scanner( System.in );

    System.out.println("Enter a list to be sorted, seperate numbers by commas:");

    String input = userInput.nextLine(); //Gets aan input as a String
    String delims = "[,]+"; //Use Comma as Delimiter
    String[] inputStringArray = input.split(delims); //Parse String and creates
                                                //an array

    System.out.println(Arrays.toString(inputStringArray)); //Outputs a string of
                                                      //the given array

    int[] toBeSorted = ArrayStringToArrayInt(inputStringArray);
    int test = toBeSorted[0] + toBeSorted[1];
    System.out.println(test);
}

public static int[] ArrayStringToArrayInt(String[] arrayString) {
    int[] arrayInt = new int[arrayString.length]; //Array of Ints for output

    for (int i = 0; i <= arrayString.length; i++ ) {  //Run through the 
    arrayInt[i] = Integer.parseInt(arrayString[i]);   //array, Parsing each
    }                                                 //item into an int

    return arrayInt;
    } 
}

array.length将给出元素的数量而不是索引,因此您必须将循环条件更改为i < arrayString.length - singhakash
6个回答

8
您的循环范围有误:
for (int i = 0; i <= arrayString.length; i++ )

应该是

for (int i = 0; i < arrayString.length; i++ )

数组的有效索引值在0到arrayString.length - 1之间。

作为奖励,这里有一种更好的使用Java 8实现相同功能的方式:

public static int[] ArrayStringToArrayInt(String[] arrayString) 
{
    return Stream.of(arrayString).mapToInt(Integer::parseInt).toArray();
}

非常感谢。我瞬间忘记了数组索引从0开始而不是1。我感觉很愚蠢。 - Avi Caspe
等一下,新的Java 8东西到底是怎么工作的? - Avi Caspe

4
在这里涉及到一位错误
for (int i = 0; i <= arrayString.length; i++ ) { 
                   ^

应该是这样的:
for (int i = 0; i < arrayString.length; i++ ) { 

2
@TedHopp 这被称为“差一错误”。引用Wikipedia的说法:“当迭代循环次数过多或过少时,它经常发生在计算机编程中。” - Adam Stelmaszczyk
好吧,我在考虑是不是出现了一个栅栏误差或循环从1到n而不是从0到n-1的问题,但我发现现代用法更通用。 - Ted Hopp

2

这是错误的

for (int i = 0; i <= arrayString.length; i++ )

应该是

for (int i = 0; i < arrayString.length; i++ )

数组的索引介于0和长度-1之间。

0

变量i应该从0N-1,其中N是数组的长度。Java数组和C数组一样是从零开始的,这意味着您应该从0N-1进行迭代。因此,您的for循环应该如下所示:

for (int i = 0; i < arrayString.length; i++)

0
你可以使用流(stream):
Arrays.stream(arrayString).mapToInt(Integer::parseInt).toArray()

0

只需更改此语句

for (int i = 0; i <= arrayString.length; i++ )

for (int i = 0; i < arrayString.length; i++ )

它将正常工作。ArrayIndexOutOfBoundsException 表示您正在尝试访问数组中不存在的索引。 例如,

int [] a= new int [5];

那么我可以使用的索引是

a [0]、a [1]、a [2]、a [3] 和 a [4]

我无法访问

a [5]

如果我尝试,我会得到 ArrayIndexOutOfBoundsException。

这意味着数组索引从 0 开始,直到数组长度-1。

希望这有所帮助。


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