37

so basically user enters a sequence from an scanner input. 12, 3, 4, etc.
It can be of any length long and it has to be integers.
I want to convert the string input to an integer array.
so int[0] would be 12, int[1] would be 3, etc.

Any tips and ideas? I was thinking of implementing if charat(i) == ',' get the previous number(s) and parse them together and apply it to the current available slot in the array. But I'm not quite sure how to code that.

4

7 回答 7

62

您可以从扫描仪读取整个输入行,然后将行拆分,,然后您有一个String[],将每个数字解析为int[]索引一对一匹配...(假设输入有效且没有NumberFormatExceptions

String line = scanner.nextLine();
String[] numberStrs = line.split(",");
int[] numbers = new int[numberStrs.length];
for(int i = 0;i < numberStrs.length;i++)
{
   // Note that this is assuming valid input
   // If you want to check then add a try/catch 
   // and another index for the numbers if to continue adding the others (see below)
   numbers[i] = Integer.parseInt(numberStrs[i]);
}

正如YoYo 的回答所暗示的,以上可以在 Java 8 中更简洁地实现:

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

处理无效输入

您将需要考虑在这种情况下您需要做什么,您是否想知道该元素的输入错误或只是跳过它。

如果您不需要了解无效输入但只想继续解析数组,您可以执行以下操作:

int index = 0;
for(int i = 0;i < numberStrs.length;i++)
{
    try
    {
        numbers[index] = Integer.parseInt(numberStrs[i]);
        index++;
    }
    catch (NumberFormatException nfe)
    {
        //Do nothing or you could print error if you want
    }
}
// Now there will be a number of 'invalid' elements 
// at the end which will need to be trimmed
numbers = Arrays.copyOf(numbers, index);

我们应该修剪结果数组的原因是,末尾的无效元素int[]将由 a 表示0,需要删除这些元素以区分 的有效输入值0

结果是

输入:“2,5,6,bad,10”
输出:[2,3,6,10]

如果您稍后需要了解无效输入,您可以执行以下操作:

Integer[] numbers = new Integer[numberStrs.length];
for(int i = 0;i < numberStrs.length;i++)        
{
    try 
    {
        numbers[i] = Integer.parseInt(numberStrs[i]);
    }
    catch (NumberFormatException nfe)   
    {
        numbers[i] = null;
    }
}

在这种情况下,错误的输入(不是有效的整数)元素将为空。

结果是

输入:“2,5,6,bad,10”
输出:[2,3,6,null,10]


您可以通过不捕获异常来潜在地提高性能(有关此问题的更多信息,请参见此问题)并使用不同的方法来检查有效整数。

于 2013-09-16T23:10:40.757 回答
38

逐行

int [] v = Stream.of(line.split(",\\s+"))
  .mapToInt(Integer::parseInt)
  .toArray();
于 2016-05-07T19:54:04.863 回答
6

Stream.of().mapToInt().toArray()似乎是最好的选择。

int[] arr = Stream.of(new String[]{"1", "2", "3"})
                  .mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(arr));
于 2019-07-22T18:42:11.697 回答
4

对于 Java 8 及更高版本:

    String[] test = {"1", "2", "3", "4", "5"};
    int[] ints = Arrays.stream(test).mapToInt(Integer::parseInt).toArray();
于 2021-02-04T16:07:27.203 回答
2

将 String 数组转换为流并映射到 int 是 java 8 中可用的最佳选择。

    String[] stringArray = new String[] { "0", "1", "2" };
    int[] intArray = Stream.of(stringArray).mapToInt(Integer::parseInt).toArray();
    System.out.println(Arrays.toString(intArray));
于 2020-11-18T10:19:39.633 回答
0
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class MultiArg {

    Scanner sc;
    int n;
    String as;
    List<Integer> numList = new ArrayList<Integer>();

    public void fun() {
        sc = new Scanner(System.in);
        System.out.println("enter value");
        while (sc.hasNextInt())
            as = sc.nextLine();
    }

    public void diplay() {
        System.out.println("x");
        Integer[] num = numList.toArray(new Integer[numList.size()]);
        System.out.println("show value " + as);
        for (Integer m : num) {
            System.out.println("\t" + m);
        }
    }
}

但是要终止 while 循环,您必须将任何字符放在输入的末尾。

前任。输入:

12 34 56 78 45 67 .

输出:

12 34 56 78 45 67
于 2015-05-21T05:04:46.530 回答
-2

Java 有一个方法,“convertStringArrayToIntArray”。

String numbers = sc.nextLine();
int[] intArray = convertStringArrayToIntArray(numbers.split(", "));
于 2020-08-30T15:09:33.430 回答