如何在JAVA中将以空格分隔的整数字符串转换为数组

10

假设我有一个字符串"1 23 40 187 298",该字符串仅包含整数和空格。如何将此字符串转换为整数数组,即[1,23,40,187,298]。

这是我的尝试:

public static void main(String[] args) {
    String numbers = "12 1 890 65";
    String temp = new String();
    int[] ary = new int[4];
    int j=0;
    for (int i=0;i<numbers.length();i++)
    {

        if (numbers.charAt(i)!=' ')
            temp+=numbers.charAt(i);
        if (numbers.charAt(i)==' '){
            ary[j]=Integer.parseInt(temp);
            j++;
        }
    }
}

但它无法正常工作,请提供一些帮助。谢谢!


首先使用 numbers.split(" ");,这样你就可以得到一个字符串数组,然后再将它们转换为整数。 - tomse
看看这个关于极其有用的 split(..) 方法的好教程:http://www.tutorialspoint.com/java/java_string_split.htm - Eric Hughes
1
字符串[] nums = numbers.split(" ");例如:numbers = "1 23 40 187 298"; 那么nums = {"1", "23", "40", "187", "298"}; 然后你可以这样做:int[] arrayOfIntegers = new int[nums.length];for (int i = 0; i < nums.length; i++) { arrayOfIntegers[i] = Integer.parseInt(nums[i]); } - user4232819
5个回答

15

你忘记了

  • resetting temp to empty string after you parse it to create place for new digits
  • that at the end of your string will be no space, so

    if (numbers.charAt(i) == ' ') {
        ary[j] = Integer.parseInt(temp);
        j++;
    }
    

    will not be invoked, which means you need invoke

    ary[j] = Integer.parseInt(temp);
    

    once again after your loop

但是更简单的方法就是使用 split(" ") 创建一个临时令牌数组,然后解析每个令牌为 int,如下所示:
String numbers = "12 1 890 65";
String[] tokens = numbers.split(" ");
int[] ary = new int[tokens.length];

int i = 0;
for (String token : tokens){
    ary[i++] = Integer.parseInt(token); 
}

使用在Java 8中引入的流(streams)也可以使其缩短:

String numbers = "12 1 890 65";
int[] array = Stream.of(numbers.split(" "))
                    .mapToInt(token -> Integer.parseInt(token))
                    .toArray();

另一种方法是使用Scanner和它的nextInt()方法来返回输入中的所有整数。假设您已经知道所需数组的大小,那么您可以简单地使用。

其他方法可以使用Scanner及其nextInt()方法从输入中返回所有整数。假设您已经知道所需数组的大小,则可以简单地使用

String numbers = "12 1 890 65";
int[] ary = new int[4];

int i = 0;
Scanner sc = new Scanner(numbers);
while(sc.hasNextInt()){
    ary[i++] = sc.nextInt();
}

请问您能否使用流(Streams)更新Java 8+的答案? - taurus05
@taurus05,基于流的解决方案已经在当前答案的结尾提到:Stream.of(numbers.split(" ")).mapToInt(token -> Integer.parseInt(token)).toArray() - Pshemo
1
@taurus05,我把基于流的解决方案放在基于循环的解决方案下面,这样新手就可以更好地理解其背后的思想。希望现在更加清晰易见了。 - Pshemo
1
或者只需使用 mapToInt(Integer::parseInt) - MC Emperor
@MCEmperor 是的,在现实世界中,我可能会使用您的方法,但由于这个问题似乎涉及相当基本的问题,我假设它是为Java新手准备的,所以我将继续使用lambda,因为在我看来,它比方法引用更容易理解。无论如何,感谢您提到它 :) - Pshemo

7

对于 Java 8 及以上版本,您可以使用以下方式:

final Integer[] ints = Arrays.stream(numbers.split(" "))
        .map(Integer::parseInt)
        .toArray(Integer[]::new);

如果你需要原始的整数,你可以使用以下代码:

final int[] ints = Arrays.stream(numbers.split(" "))
        .mapToInt(Integer::parseInt)
        .toArray();

你确定这个程序可以在 JDK 8 之前的版本中运行吗?如果我没记错的话,map 函数和将函数作为参数传递的功能只有在 Java 8 中才可用。 - niceman
谢谢esin88,你的回答很优雅,但是我们必须考虑一些没有最新版本的操作者。 - niceman
是的,但当我回答时,已经有一个关于Java 7及更早版本的答案了 :) - esin88

0

试试这个,

public static void main(String[] args) {
    String numbers = "12 1 890 65";
    String[] parts = numbers.split(" ");

    int[] ary = new int[4];
    int element1 = Integer.parseInt(parts[0]);
    int element2 = Integer.parseInt(parts[1]);
    int element3 = Integer.parseInt(parts[2]);
    int element4 = Integer.parseInt(parts[3]);

    ary[0] = element1;
    ary[1] = element2;
    ary[2] = element3;
    ary[3] = element4;

    for(int i=0; i<4; i++){
        System.out.println(ary[i]);
    }

}

0

我在Android开发中遇到了类似的问题。我想将一个长字符串转换为两个数组-字符串数组xtokens和整数数组ytokens。

String result = "201 5 202 8 203 53 204 8";             
String[] tokens = result.split(" ");
String[] xtokens = new String[tokens.length/2 + 1];
int[] ytokens = new int[tokens.length/2 + 1];

for(int i = 0, xplace = 0, yplace = 0; i<tokens.length; i++){
    String temptoken = new String(tokens[i]);
    if(i % 2 == 0){
        xtokens[xplace++] = temptoken;
    }else {
        ytokens[yplace++] = Integer.parseInt(temptoken);
    }
}

你可以先将该字符串按空格分割为字符串数组,然后将其转换为整数数组。


0

在解析整数后,将tmp字符串重置为"",除非您希望继续将字符串的所有数字附加在一起。还有其他替代方法-例如,在空格字符上将字符串拆分为数组,然后逐个解析数字。


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