web-dev-qa-db-fra.com

Convertir un entier en tableau de chiffres

J'essaie de convertir un entier en tableau, par exemple 1234 en int[] arr = {1,2,3,4}; 

J'ai écrit une fonction 

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]);
            }          
}

Mais une exception est levée:

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

Avez-vous des idées?

34
hkguile

Le problème immédiat est dû au fait que vous avez utilisé <= temp.length() au lieu de < temp.length(). Cependant, vous pouvez y parvenir beaucoup plus simplement. Même si vous utilisez l'approche par chaîne, vous pouvez utiliser:

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';
}

Vous devez faire la même modification pour utiliser < newGuess.length() lors de l'impression du contenu. Sinon, pour un tableau de longueur 4 (qui a des index valides 0, 1, 2, 3), vous essayez d'utiliser newGuess[4]. La grande majorité des boucles for que j'écris utilise < dans la condition, plutôt que <=.

48
Jon Skeet

Vous n'avez pas besoin de convertir int en String, utilisez simplement % 10 pour obtenir le dernier chiffre, puis divisez votre int par 10 pour passer au suivant.

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

cela vous laissera avec ArrayList contenant vos chiffres dans l'ordre inverse. Vous pouvez facilement le retourner si nécessaire et le convertir en int []. 

36
Vladimir
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);    
}

L'idée principale est

  1. Convertir l'int en sa valeur de chaîne
Integer.toString(num);
  1. Obtient un flux d'int qui représente la valeur ASCII de chaque caractère (~ chiffre) composant la version String de notre entier
Integer.toString(num).chars();
  1. Convertir la valeur ascii de chaque caractère en sa valeur . Pour obtenir la valeur int réelle d'un caractère, nous devons soustraire la valeur de code ASCII du caractère '0' du code ASCII Pour obtenir tous les chiffres de notre numéro, cette opération doit être appliquée à chaque caractère (correspondant au chiffre) composant la chaîne équivalente à notre numéro, ce qui est fait en appliquant la fonction map ci-dessous à notre fonction. IntStream.
Integer.toString(num).chars().map(c -> c-'0');
  1. Convertit le flux d'int en un tableau d'int en utilisant toArray ()
Integer.toString(num).chars().map(c -> c-'0').toArray();
22

Il serait beaucoup plus simple d'utiliser la méthode String.split

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

En Scala, vous pouvez faire comme:

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

En une ligne et sans inverser la commande.

2
Sky

Vous pouvez utiliser-

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;
}
2
Abhijeet srivastava

Vous n'êtes pas obligé d'utiliser substring(...). Utilisez temp.charAt(i) pour obtenir un chiffre et utilisez le code suivant pour convertir char en int.

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

Vous pouvez faire quelque chose comme ça 

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;
}

cela permettra également de maintenir l'ordre.

répondez s'il vous plaît si cela vous a aidé.

1
user10291695

Commencez par prendre l'entrée utilisateur en tant qu'entier int puis convertissez-la en String, puis créez un tableau de caractères de taille str.length(), remplissez maintenant un tableau de caractères avec pour boucle en utilisant 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 +" ");
}
0
Common Man
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;

Bro me dit si cela fonctionne. Vous devrez mettre cela dans une méthode mon fils.

0
PantOffl

temp2 = temp.substring(i); retournera toujours la chaîne vide "".

Au lieu de cela, votre boucle devrait avoir la condition i<temp.length(). Et temp2 devrait toujours être temp.substring(i, i+1);.

De même, lorsque vous imprimez newGuess, vous devez boucler jusqu'à newGuess.length sans l'inclure. Donc, votre condition devrait être i<newGuess.length.

0
tskuzzy

Le <= dans l'instruction for devrait être un <

En passant, il est possible de le faire beaucoup plus efficacement sans utiliser de chaînes, mais plutôt avec /10 et %10 d’entiers.

_

0

Je peux suggérer la méthode suivante:

convertir le nombre en chaîne -> convertir la chaîne en un tableau de caractères -> convertir le tableau de caractères en un tableau d'entiers

Voici mon code:

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
    }
}
0
Erfan

Je ne peux pas ajouter de commentaires à la solution de Vladimir, mais je pense que cela est plus efficace également lorsque vos chiffres initiaux pourraient également être inférieurs à 10. »

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

N'oubliez pas d'inverser le tableau.

0
Roberto Gimenez

Appelez ces fonction

  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;
}
0
Nayan

Voici la fonction qui prend un entier et retourne un tableau de chiffres.

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;
}
0
Shadab Eqbal