【问题标题】:how to convert an integer string separated by space into an array in JAVA如何在JAVA中将一个以空格分隔的整数字符串转换为数组
【发布时间】:2015-03-23 20:09:29
【问题描述】:

假设我有一个字符串“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(" ");,这样你就有了一个字符串数组,然后你可以将它们转换成int的
  • 看看这个非常有用的教程split(..) 方法:tutorialspoint.com/java/java_string_split.htm
  • String[]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 &lt; nums.length; i++) { arrayOfIntegers[i] = Integer.parseInt(nums[i]); }

标签: java arrays string


【解决方案1】:

你忘记了

  • 在解析 temp 后将其重置为空字符串,以便为新数字创建位置
  • 字符串末尾没有空格,所以

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

    不会被调用,也就是说你需要调用

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

    循环后再次


但更简单的方法是使用 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 中添加的流来缩短:

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

其他方法可能是使用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();
}

【讨论】:

  • 您能否使用流更新您对 Java 8+ 的答案?
  • @taurus05 在当前答案的末尾已经提到了基于流的解决方案:Stream.of(numbers.split(" ")).mapToInt(token -&gt; Integer.parseInt(token)).toArray()。
  • @taurus05 我将基于流的解决方案移到了基于循环的解决方案的正下方,这样刚接触它的人就会更好地理解它背后的想法。希望现在能看得更清楚。
  • 或者只是mapToInt(Integer::parseInt)。
  • @MCEmperor 是的,在现实世界中我可能会使用你的方法,但由于这个问题似乎是一个非常基本的问题,我假设它是为 Java 新手准备的,所以我将继续使用 lambda,因为 IMO 它比方法引用更容易理解。不管怎样,谢谢你提到它:)
【解决方案2】:

对于 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();

【讨论】:

  • 您确定这将适用于早于 8 的 jdk 吗?如果我没有记错的话,map 函数和作为参数传递函数仅在 java-8 中可用。
  • 感谢 esin88,您的回答很优雅,但我们必须考虑一些没有最新版本的 OP
  • 是的,但是当我回答时,已经有 java 7 及更早版本的答案:)
【解决方案3】:

解析整数后将 tmp 字符串重置为“”,除非您希望继续将字符串的所有数字附加在一起。还有其他选择 - 例如将字符串拆分为空格字符上的数组,然后单独解析数字

【讨论】:

    【解决方案4】:

    试试这个,

    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]);
        }
    
    }
    

    【讨论】:

      【解决方案5】:

      我在 android 开发中遇到过类似的问题。我想将一个长字符串转换为两个数组 -String 数组 xtokens 和 int 数组 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);
          }
      }
      

      可以先把这个字符串转换成空格分隔的字符串数组,再转换成int数组。

      【讨论】:

        猜你喜欢
        • 2021-01-22
        • 2018-07-21
        • 2018-02-16
        • 2011-09-20
        • 2015-06-02
        • 2023-02-05
        • 1970-01-01
        • 2016-12-22
        • 2014-07-14
        相关资源
        最近更新 更多