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

Преобразование целого числа в массив цифр

Я пытаюсь преобразовать целое число в массив, например, с 1234 по int[] arr = {1,2,3,4};

Я написал функцию

public static void convertInt2Array(int guess)  {
    String temp = Integer.toString(guess);
    String temp2;
    int temp3;
    int [] newGuess = new int[temp.length()];
    for(int i=0;i<=temp.length();i++) {
        if (i!=temp.length()) {
            temp2 = temp.substring(i, i+1);
        } else {
            temp2 = temp.substring(i);
            //System.out.println(i);
        }
        temp3 =  Integer.parseInt(temp2);    
        newGuess[i] = temp3;
    }
            for(int i=0;i<=newGuess.length;i++) {
                System.out.println(newGuess[i]);
            }          
}

Но генерируется исключение:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:504)
    at java.lang.Integer.parseInt(Integer.java:527)
    at q4.test.convertInt2Array(test.java:28)
    at q4.test.main(test.java:14)
Java Result: 1

Есть идеи?

4b9b3361

Ответ 1

Непосредственная проблема связана с использованием <= temp.length() вместо < temp.length(). Однако вы можете добиться этого намного проще. Даже если вы используете строковый подход, вы можете использовать:

String temp = Integer.toString(guess);
int[] newGuess = new int[temp.length()];
for (int i = 0; i < temp.length(); i++)
{
    newGuess[i] = temp.charAt(i) - '0';
}

Вам нужно сделать такое же изменение, чтобы использовать < newGuess.length() при распечатке содержимого - иначе для массива длиной 4 (который имеет действительные индексы 0, 1, 2, 3) вы попытаетесь использовать newGuess[4]. Подавляющее большинство циклов for пишу использование < в условии, а не <=.

Ответ 2

Вам не нужно преобразовать int в String, просто используйте % 10, чтобы получить последнюю цифру, а затем разделите свой int на 10, чтобы перейти к следующему.

int temp = test;
ArrayList<Integer> array = new ArrayList<Integer>();
do{
    array.add(temp % 10);
    temp /= 10;
} while  (temp > 0);

это оставит вас с ArrayList, содержащим ваши цифры в обратном порядке. Вы можете легко вернуть его, если потребуется, и преобразовать его в int [].

Ответ 3

public static void main(String[] args)
{
    int num = 1234567;  
    int[]digits = Integer.toString(num).chars().map(c -> c-'0').toArray();  
    for(int d : digits)
        System.out.print(d);    
}

Основная идея

  1. Преобразуйте int в его строковое значение
Integer.toString(num);
  1. Получите поток int, который представляет значение ASCII каждого символа (~ цифра), составляющего строковую версию нашего целого числа
Integer.toString(num).chars();
  1. Преобразуйте значение ascii каждого символа в его значение. Чтобы получить действительное значение типа int для символа, мы должны вычесть значение кода ASCII символа '0' из кода ASCII фактического символа. Чтобы получить все цифры нашего номера, эта операция должна быть применена к каждому символу (соответствующему цифре), составляющему строковый эквивалент нашего номера, что делается путем применения функции map ниже к нашему IntStream.
Integer.toString(num).chars().map(c -> c-'0');
  1. Преобразуйте поток int в массив int, используя toArray()
Integer.toString(num).chars().map(c -> c-'0').toArray();

Ответ 4

Было бы гораздо проще использовать метод String.split

public static void fn(int guess) {
    String[] sNums = Integer.toString(guess).split("");
    for (String s : nums) {
    ...

Ответ 5

В Scala вы можете сделать так:

def convert(a: Int, acc: List[Int] = Nil): List[Int] =
  if (a > 0) convert(a / 10, a % 10 +: acc) else acc

В одной строке и без изменения порядка.

Ответ 6

Вы можете использовать -

private int[] createArrayFromNumber(int number) {
    String str = (new Integer(number)).toString();
    char[] chArr = str.toCharArray();
    int[] arr = new int[chArr.length];
    for (int i = 0; i< chArr.length; i++) {
        arr[i] = Character.getNumericValue(chArr[i]);
    }
    return arr;
}

Ответ 7

Вы можете просто сделать:

char[] digits = string.toCharArray();

а затем вы можете оценить символы как целые числа: например:

char[] digits = "12345".toCharArray();
int digit = Character.getNumericValue(digits[0]);
System.out.println(digit); // prints 1

Ответ 8

Вам не нужно использовать substring(...). Используйте temp.charAt(i) для получения цифры и используйте следующий код для преобразования char в int.

char c = '7';
int i = c - '0';
System.out.println(i);

Ответ 9

Вы можете сделать что-то вроде этого

public int[] convertDigitsToArray(int n) {

    int [] temp = new int[String.valueOf(n).length()]; //calculate the length of digits
    int i = String.valueOf(n).length()-1 ;  //initialize the value to the last index
    do {
        temp[i]= n%10;
        n = n/10;
        i--;
    }while(n>0);
    return temp;
}

это также будет поддерживать порядок.

пожалуйста, ответьте, если это помогло вам.

Ответ 10

Попробуй это!


int num = 1234; 

String s = Integer.toString(num); 

int[] intArray = new int[s.length()]; 


for(int i=0; i<s.length(); i++){
    intArray[i] = Character.getNumericValue(s.charAt(i));
}

Ответ 11

temp2 = temp.substring(i); всегда будет возвращать пустую строку "".

Вместо этого в вашем цикле должно быть условие i<temp.length(). И temp2 всегда должен быть temp.substring(i, i+1);.

Аналогично, когда вы печатаете newGuess, вы должны зацикливаться до newGuess.length, но не включаться. Таким образом, ваше состояние должно быть i<newGuess.length.

Ответ 12

<= в инструкции for должен быть <

BTW, это можно сделать гораздо эффективнее без использования строк, но вместо этого используйте /10 и %10 целых чисел.

_

Ответ 13

Вызвать эту функцию

  public int[] convertToArray(int number) {
    int i = 0;
    int length = (int) Math.log10(number);
    int divisor = (int) Math.pow(10, length);
    int temp[] = new int[length + 1];

    while (number != 0) {
        temp[i] = number / divisor;
        if (i < length) {
            ++i;
        }
        number = number % divisor;
        if (i != 0) {
            divisor = divisor / 10;
        }
    }
    return temp;
}

Ответ 14

Я могу предложить следующий метод:

преобразовать число в строку → преобразовать строку в массив символов → преобразовать массив символов в массив целых чисел

Вот мой код:

public class test {
public static void main(String[] args) {
    int num1 = 123456; // example 1
    int num2 = 89786775; // example 2

    String str1 = Integer.toString(num1); // converts num1 into String
    String str2 = Integer.toString(num2); // converts num2 into String

    char[] ch1 = str1.toCharArray();// gets str1 into an array of char
    char[] ch2 = str2.toCharArray();// gets str2 into an array of char

    int[] t1 = new int[ch1.length];// defines t1 for bringing ch1 into it
    int[] t2 = new int[ch2.length];// defines t2 for bringing ch2 into it

    for(int i=0;i<ch1.length;i++) // watch the ASCII table 
        t1[i]= (int) ch1[i]-48;// ch1[i] is 48 units more than what we want

    for(int i=0;i<ch2.length;i++)// watch the ASCII table 
        t2[i]= (int) ch2[i]-48;// ch2[i] is 48 units more than what we want
    }
}

Ответ 15

int count = 0;
String newString = n + "";
char [] stringArray = newString.toCharArray();
int [] intArray = new int[stringArray.length];
for (char i : stringArray) {
  int m = Character.getNumericValue(i);
  intArray[count] = m;
  count += 1;
}
return intArray;

Расскажите мне, если это сработает. Тебе придется поместить это в метод моего сына.

Ответ 16

Я не могу добавлять комментарии к решению Владимира, но я думаю, что это более эффективно, когда ваши начальные номера также могут быть ниже 10. Это мое предложение:

int temp = test;
ArrayList<Integer> array = new ArrayList<Integer>();
do{
  array.add(temp % 10);
  temp /= 10;
} while  (temp > 1);

Не забудьте изменить массив.

Ответ 17

Вот функция, которая принимает целое число и возвращает массив цифр.

static int[] Int_to_array(int n)
{
     int j = 0;
     int len = Integer.toString(n).length();
     int[] arr = new int[len];
     while(n!=0)
     {
         arr[len-j-1] = n%10;
         n = n/10;
         j++;
     }
     return arr;
}

Ответ 18

Сначала примите ввод от пользователя как int, а затем преобразуйте его в String а затем создайте символьный массив размером str.length(), теперь str.length() массив char циклом for с помощью charAt().

Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
String str = Integer.toString(num);
char [] ch = new char [str.length()];
for(int i=0;i<str.length();i++)
{
ch[i]= str.charAt(i);   
} 
for(char c: ch)
{   
System.out.print(c +" ");
}

Ответ 19

Давайте решим это с помощью рекурсии...

ArrayList<Integer> al = new ArrayList<>();
void intToArray(int num){
    if( num != 0){
        int temp = num %10;
        num /= 10;
        intToArray(num);
        al.add(temp);
    }
}

Пояснение: Предположим, значение num = 12345.

Во время первого вызова функции temp хранит значение: 5 и значение num = 1234. Он снова передается функции, теперь значение временного хранения: 4 и значение num = 123... эта функция вызывает себя, пока значение num не станет равно 0.

Трассировки стека:

 temp - 5 | num - 1234
 temp - 4 | num - 123
 temp - 3 | num - 12
 temp - 2 | num - 1
 temp - 1 | num - 0

 And then, It calls add method of ArrayList and value of temp is added to it, so value of list:
 ArrayList - 1
 ArrayList - 1,2
 ArrayList - 1,2,3
 ArrayList - 1,2,3,4
 ArrayList - 1,2,3,4,5

Я надеюсь, что это очистит ваши сомнения с помощью рекурсии.

Ответ 20

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

public static int[] splitAnIntegerIntoAnArrayOfNumbers (int a) {
    int temp = a;
    ArrayList<Integer> array = new ArrayList<Integer>();
    do{
        array.add(temp % 10);
        temp /= 10;
    } while  (temp > 0);
    int[] arrayOfNumbers = new int[array.size()];
    for(int i = 0, j = array.size()-1; i < array.size(); i++,j--) 
        arrayOfNumbers [j] = array.get(i);
    return arrayOfNumbers;
}

Важно: это решение не будет работать для отрицательных целых чисел.

Ответ 21

public static void main(String k[])
{  
    System.out.println ("NUMBER OF VALUES ="+k.length);
    int arrymy[]=new int[k.length];
    for (int i = 0; i < k.length; i++)
    {
        int newGues = Integer.parseInt(k[i]);
        arrymy[i] = newGues;
    }
}