将整数转换为数字数组

75

我尝试将一个整数转换成一个数组。例如,将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: 针对字符串的输入:“”
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

我该如何解决这个问题?


1
Integer.toString(n).chars().map(a->a-'0').toArray(); - David S Alderson
增加了对负数值的支持,请查看下面的答案(针对新开发人员,因为已经过去8年了) - Phil
26个回答

93

这个问题是因为你使用了<= 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循环都使用条件中的<,而不是<=


3
他们可以存储单个0,但不能存储前导零。这是您设计的问题,而不是我的实现问题。您需要在方法调用中指定长度,或者改用其他表示方法,因为“00001”与“1”是相同的int值。 - Jon Skeet
2
@JonSkeet,你能解释一下为什么在这行代码newGuess[i] = temp.charAt(i) - '0';中加入了-'0'吗? - Kasun Siyambalapitiya
3
@KasunSiyambalapitiya,不,temp.charAt(0) 不是 1,而是字符 '1'。它的整数值为 49,因为Unicode字符49是数字1。重要的是要区分字符值和它作为数字所代表的整数值。 - Jon Skeet
负数怎么办?这是一个不完整的答案。 - Phil
@JonSkeet 我知道,但我只是有一个负数的用例:( 这是我的参考,时间已经用完了,所以:(( - Phil
显示剩余5条评论

64

你不需要将 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数组。


7
您可以使用 array.add(0, temp %10) 来避免翻转列表。 - priteshbaviskar
1
即使是Jon Skeet的解决方案也无法处理负整数。 - Dawood ibn Kareem

57

使用:

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. 将整数转换为其字符串值

    Integer.toString(num);
    
    获得一个整数流,该流表示我们的整数的字符串版本中组成每个字符(~数字)的ASCII值。
    Integer.toString(num).chars();
    
  2. 将每个字符的ASCII值转换为其值。 要获取字符的实际int值,我们必须从实际字符的ASCII代码值中减去字符'0'的ASCII代码值。 要获取我们数字的所有数字,必须对构成我们数字字符串的每个字符(对应于数字)应用此操作,这是通过将下面的映射函数应用于我们的IntStream来完成的。

  3. Integer.toString(num).chars().map(c -> c-'0');
    
  4. 使用toArray()将int流转换为int数组

  5.  Integer.toString(num).chars().map(c -> c-'0').toArray();
    

8

让我们使用递归来解决这个问题...

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。它再次被传递到函数中,现在temp保存了值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

然后它调用了 ArrayList 的 add 方法,将 temp 的值添加到其中,因此 list 的值为:

 ArrayList - 1
 ArrayList - 1,2
 ArrayList - 1,2,3
 ArrayList - 1,2,3,4
 ArrayList - 1,2,3,4,5

5
你可以这样做: char[] digits = string.toCharArray(); 之后你就可以将字符转化为整数。
例如:
char[] digits = "12345".toCharArray();
int digit = Character.getNumericValue(digits[0]);
System.out.println(digit); // Prints 1

5

您可以使用:

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

4

使用String.split方法会更简单:

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

3
你可以像这样做:

你可以这样做:

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

这将保持顺序。

2
在Scala中,您可以像这样做:
def convert(a: Int, acc: List[Int] = Nil): List[Int] =
  if (a > 0) convert(a / 10, a % 10 +: acc) else acc

在不改变顺序的情况下,一行代码实现。

2
但问题标记了Java(?)。 - Peter Mortensen

2

试试这个!


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接