Преобразование строкового массива в массив целых чисел

поэтому пользователь вводит последовательность со входа сканера. 12, 3, 4 и т.д.
Он может быть длинной длины и должен быть целым числом.
Я хочу преобразовать ввод строки в целочисленный массив.
поэтому int[0] будет 12, int[1] будет 3 и т.д.

Любые советы и идеи? Я думал о внедрении if charat(i) == ',' получить предыдущие числа и проанализировать их вместе и применить к текущему доступному слоту в массиве. Но я не совсем уверен, как это кодировать.

Ответ 1

Вы можете прочитать всю строку ввода из сканера, затем разделите строку на ,, тогда у вас есть String[], проанализируйте каждое число в int[] с индексом один на один, соответствующий... (предполагая действительный ввод и no 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 answer, вышесказанное может быть достигнуто более кратко в 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[] будут представлены 0, их нужно удалить, чтобы различать допустимое входное значение 0.

Результаты в

Вход: "2,5,6, плохо, 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;
    }
}

В этом случае плохой ввод (не действительное целое число) элемент будет null.

Результаты в

Вход: "2,5,6, плохо, 10"
Выход: [2,3,6, null, 10]


Вы могли бы повысить производительность, не поймав исключение (см. этот вопрос для получения дополнительной информации об этом) и используйте другой метод для проверки действительных целых чисел.

Ответ 2

Построчно

int [] v = Stream.of(line.split(",\\s+"))
  .mapToInt(Integer::parseInt)
  .toArray();

Ответ 3

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 вы должны поместить любой charecter в конец ввода.

ех. ввод:

12 34 56 78 45 67 .

выход:

12 34 56 78 45 67

Ответ 4

Stream.of().mapToInt().toArray() представляется наилучшим вариантом.

int[] arr = Stream.of(new String[]{"1", "2", "3"})
                  .mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(arr));