it-swarm.com.ru

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

Я должен ввести строку с числами, например: 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);
        }
    }
}
24
user1076331

Для ввода 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 для компиляции кода для его отладки! :)

50
corsiKa

Java 8 предлагает потоковую альтернативу ручной итерации:

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

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

17
Andy Brown

Давайте рассмотрим, что у вас есть входные данные как «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);
}
2
Tapan Thaker
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));
0
Trevor Freeman

Немного измените порядок, в котором вы делаете вещи. Вы, кажется, делите на 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's 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);
        }
    }
}
0
Mike McMahon

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

0
Colby