Подтвердить что ты не робот

Разбить строку и поместить ее в массив int

Мне нужно ввести строку с числами ex: 1,2,3,4,5. Это образец ввода, затем я должен поместить его в массив INT, чтобы я мог сортировать его, но не работает так, как он должен работать.

package array;

import java.util.Scanner;

public class Array {

    public static void main(String[] args) {
        String input;
        int length, count, size;
        Scanner keyboard = new Scanner(System.in);
        input = keyboard.next();
        length = input.length();
        size = length / 2;
        int intarray[] = new int[size];
        String strarray[] = new String[size];
        strarray = input.split(",");

        for (count = 0; count < intarray.length ; count++) {
            intarray[count] = Integer.parseInt(strarray[count]);
        }

        for (int s : intarray) {
            System.out.println(s);
        }
    }
}
4b9b3361

Ответ 1

Для ввода 1,2,3,4,5 вход имеет длину 9. 9/2 = 4 в целочисленной математике, поэтому вы сохраняете только первые четыре переменные, не все 5.

Даже если вы исправили это, он бы ужасно нарушился, если вы передали вход 10,11,12,13

Он работал бы (случайно), если бы вы использовали 1,2,3,4,50 для ввода, как ни странно: -)

Вам было бы намного лучше делать что-то вроде этого

String[] strArray = input.split(",");
int[] intArray = new int[strArray.length];
for(int i = 0; i < strArray.length; i++) {
    intArray[i] = Integer.parseInt(strArray[i]);
}

В будущем, когда вы получите сообщение об ошибке, я настоятельно рекомендую опубликовать его с кодом. У вас может не быть кого-то с jdk, доступным для компиляции кода для его отладки!:)

Ответ 2

Java 8 предлагает альтернативу ручным итерациям на основе потоков:

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

Будьте готовы поймать NumberFormatException, если возможно, чтобы входные данные содержали последовательности символов, которые не могут быть преобразованы в целое число.

Ответ 3

Учтите, что у вас есть ввод как "1,2,3,4".

Это означает, что длина ввода равна 7. Итак, теперь вы пишете размер = 7/2 = 3.5. Но поскольку размер int, он будет округлен до 3. Короче говоря, вы теряете 1 значение.

Если вы переписываете код, как показано ниже, он должен работать:

String input;
int length, count, size;
Scanner keyboard = new Scanner(System.in);
input = keyboard.next();
length = input.length();

String strarray[] = input.split(",");
int intarray[] = new int[strarray.length];

for (count = 0; count < intarray.length ; count++) {
    intarray[count] = Integer.parseInt(strarray[count]);
}

for (int s : intarray) {
    System.out.println(s);
}

Ответ 4

String input = "2,1,3,4,5,10,100";
String[] strings = input.split(",");
int[] numbers = new int[strings.length];
for (int i = 0; i < numbers.length; i++)
{
  numbers[i] = Integer.parseInt(strings[i]);
}
Arrays.sort(numbers);

System.out.println(Arrays.toString(numbers));

Ответ 5

Вы выполняете деление Integer, так что вы потеряете правильную длину, если пользователь будет вводить нечетное количество входных данных - это одна из проблем, которые я заметил. Из-за этого, когда я запускаю код с вводом "1,2,3,4,5,6,7", мое последнее значение игнорируется...

Ответ 6

Измените порядок, в котором вы делаете что-то немного. Кажется, вы разделились на 2 без каких-либо особых причин.

В то время как ваше приложение не гарантирует входную строку с разделителями с запятой с двумя двоеточиями, вы можете легко сделать это:

package com;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        // Good practice to initialize before use
        Scanner keyboard = new Scanner(System.in);
        String input = "";
        // it also a good idea to prompt the user as to what is going on
        keyboardScanner : for (;;) {
            input = keyboard.next();
            if (input.indexOf(",") >= 0) { // Realistically we would want to use a regex to ensure [0-9],...etc groupings 
                break keyboardScanner;  // break out of the loop
            } else { 
                keyboard = new Scanner(System.in);
                continue keyboardScanner; // recreate the scanner in the event we have to start over, just some cleanup
            }
        }

        String strarray[] = input.split(","); // move this up here      
        int intarray[] = new int[strarray.length];

        int count = 0; // Declare variables when they are needed not at the top of methods as there is no reason to allocate memory before it is ready to be used
        for (count = 0; count < intarray.length; count++) {
            intarray[count] = Integer.parseInt(strarray[count]);
        }

        for (int s : intarray) {
            System.out.println(s);
        }
    }
}

Ответ 7

Что-то вроде этого:

  public static void main(String[] args) {
   String N = "ABCD";
   char[] array = N.toCharArray();

   // and as you can see:
    System.out.println(array[0]);
    System.out.println(array[1]);
    System.out.println(array[2]);
  }