Convertir entier en tableau de chiffres
J'essaie de convertir un nombre entier en tableau par exemple 1234 à 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?
17 réponses
Le problème immédiat est dû au fait que vous utilisez <= temp.length()
au lieu de < temp.length()
. Cependant, vous pouvez y parvenir beaucoup plus simplement. Même si vous utilisez l'approche string, 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 le même changement d'utiliser < newGuess.length()
lors de l'impression du contenu de trop - sinon, pour un tableau de longueur 4 (qui a valide les indices 0, 1, 2, 3) vous allez essayer d'utiliser newGuess[4]
. La grande majorité des boucles for
que j'écris utilisent <
dans la condition, plutôt que <=
.
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 restaurer si nécessaire et le convertir en int[].
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
- convertit l'int en sa valeur de chaîne
Integer.toString(num);
- obtenir un flux de int qui représente la valeur ASCII de chaque caractère (~digit) composant la version de chaîne de notre entier
Integer.toString(num).chars();
- convertit la valeur ascii de chaque caractère en sa valeur. Pour obtenir la valeur int réelle d'un char, nous devons soustraire la valeur de code ASCII du char ' 0 ' du code ASCII du char réel. Pour obtenir tous les chiffres de notre numéro, cette l'opération doit être appliquée sur chaque caractère (correspondant au chiffre) composant l'équivalent de chaîne de notre Nombre, ce qui se fait en appliquant la fonction map ci-dessous à notre IntStream.
Integer.toString(num).chars().map(c -> c-'0');
- convertit le flux de int en un tableau de int en utilisant toArray ()
Integer.toString(num).chars().map(c -> c-'0').toArray();
Dans 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
Dans une ligne et sans Inverser l'ordre.
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;
}
, Vous pouvez simplement faire:
char[] digits = string.toCharArray();
Et vous pouvez ensuite évaluer les caractères en tant qu'entiers: par exemple:
char[] digits = "12345".toCharArray();
int digit = Character.getNumericValue(digits[0]);
System.out.println(digit); // prints 1
, Il serait beaucoup plus simple d'utiliser les String.split
méthode
public static void fn(int guess) {
String[] sNums = Integer.toString(guess).split("");
for (String s : nums) {
...
Vous n'avez pas besoin d'utiliser substring(...)
. Utiliser temp.charAt(i)
pour obtenir un chiffre et utilisez le code suivant pour convertir char
à int
.
char c = '7';
int i = c - '0';
System.out.println(i);
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
mais pas y compris. Donc, votre condition devrait être i<newGuess.length
.
Le <=
dans la déclaration devrait être un <
BTW, il est possible de le faire beaucoup plus efficacement sans utiliser de chaînes, mais à la place en utilisant /10
et %10
d'entiers.
_
Appelez ces fonctions
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;
}
Je peux suggérer la méthode suivante:
Convertir le nombre en une chaîne de caractères--> convertir la chaîne en un tableau de caractères--> convertir le tableau de caractères dans 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
}
}
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 dites-moi si cela fonctionne. Vous devrez mettre cela dans une méthode mon fils.
Je ne peux pas ajouter de commentaires à la solution de Vladimir, mais je pense que c'est plus efficace aussi lorsque vos chiffres initiaux pourraient être également inférieurs à 10. Voici ma proposition:
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.
Voici la fonction qui prend un nombre 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;
}
Prenez D'abord l'entrée de l'utilisateur en tant qu'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 la boucle for 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 +" ");
}
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;
}
}