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

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

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

3 ответов


вы можете прочитать всю входную строку от сканера, а затем разделить строку на , тогда у вас есть 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]);
}

As йо-йо это предполагает, что выше может быть достигнуто более кратко в 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]


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


строка за строкой

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

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 в конце ввода.

ex. ввод:

12 34 56 78 45 67 .

выход:

12 34 56 78 45 67