Преобразование строкового массива в целочисленный массив
таким образом, в основном пользователь вводит последовательность из ввода сканера.
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]
вы могли потенциально повысить производительность, не поймав исключение (см. этот вопрос для получения дополнительной информации об этом) и использовать другой метод для проверки действительных чисел.
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