繁体   English   中英

Java中的int数组到int数

[英]int array to int number in Java

我是这个网站的新手,如果我在这里,那是因为我在网络上的任何地方都没有找到答案,相信我:我已经用谷歌搜索了很长时间,但我能找到的只是如何转换编号到数组而不是相反。 我正在寻找一种将 int 数组转换为 int 数的简单方法或函数。 让我解释一下,例如我有这个:

int[] ar = {1, 2, 3};

我想要这个:

int nbr = 123;

在我的脑海中它看起来像这样(即使我知道这不是正确的方法):

int nbr = ar.toInt(); // I know it's funny

如果您对我如何做到这一点有任何想法,那就太棒了。

0结果开始。 循环遍历int数组的所有元素。 将结果乘以10 ,然后将数组中的当前数字相加。 在循环结束时,你有你的结果。

  • 结果:0
  • 循环 1:结果 * 10 => 0,结果 + 1 => 1
  • 循环 2:结果 * 10 => 10,结果 + 2 => 12
  • 循环 3:结果 * 10 >= 120,结果 + 3 => 123

这可以通过将基数从10 (此处)更改为其他值来推广到任何基数,例如16进制的 16。

您必须在数组中循环并添加正确的值。 正确的值是数组中的当前元素乘以 10^position。

所以:ar[0]*1 + ar[1]*10 + ar[2] *100 + .....

    int res=0;
    for(int i=0;i<ar.length;i++) {
         res=res*10+ar[i];
    }

或者

   for(int i=0,exp=ar.length-1;i<ar.length;i++,exp--)
        res+=ar[i]*Math.pow(10, exp);

首先,您必须将每个数字转换为字符串,然后连接字符串并将其解析回整数。 这是一个实现:

int arrayToInt(int[] arr)
{
    //using a Stringbuilder is much more efficient than just using += on a String.
    //if this confuses you, just use a String and write += instead of append.
    StringBuilder s = new StringBuilder(); 

    for (int i : arr)
    {
         s.append(i); //add all the ints to a string
    }

    return Integer.parseInt(s.toString()); //parse integer out of the string
}

请注意,如果数组中第一个值之后的任何值为负数,则会产生错误,因为减号会干扰解析。

此方法适用于所有正整数,但如果您知道数组中的所有值都只有一位长(如您的示例中所示),您可以完全避免字符串操作,只需使用基本数学:

int arrayToInt(int[] arr)
{
    int result = 0;

    //iterate backwards through the array so we start with least significant digits
    for (int n = arr.length - 1, i = 1; n >= 0; n --, i *= 10) 
    {
         result += Math.abs(arr[n]) * i;
    }

    if (arr[0] < 0) //if there's a negative sign in the beginning, flip the sign
    {
        result = - result;
    }

    return result;
}

如果第一个之后的任何值是负数,此版本不会产生错误,但会产生奇怪的结果。

没有内置函数可以执行此操作,因为数组的值通常表示不同的数字,而不是数字中的数字。

编辑:

为了回应您的评论,请尝试使用此版本来处理多头:

long arrayToLong(int[] arr)
{
    StringBuilder s = new StringBuilder(); 

    for (int i : arr)
    {
         s.append(i);
    }

    return Long.parseLong(s.toString());
}

编辑2:

针对您的第二条评论:

int[] longToIntArray(long l)
{
    String s = String.valueOf(l);   //expand number into a string

    String token;

    int[] result = new int[s.length() / 2]; 

    for (int n = 0; n < s.length()/2; n ++) //loop through and split the string
    {
        token = s.substring(n*2, (n+2)*2);
        result[n] = Integer.parseInt(token); //fill the array with the numbers we parse from the sections
    }

    return result;
}

是的,您可以自己编写函数

int toInt(int[] array) {
    int result = 0;
    int offset = 1;
    for(int i = array.length - 1; i >= 0; i--) {
        result += array[i]*offset;
        offset *= 10;
    }
    return result;
}

我认为它背后的逻辑非常简单。 您只需遍历数组(首先是最后一个元素),然后将数字乘以 10 的右幂“将数字放在正确的位置”。 最后你会得到返回的号码。

int nbr = 0;
for(int i = 0; i < ar.length;i++)
    nbr = nbr*10+ar[i];

最后,你最终得到了你想要的 nbr。

对于你给我们的新阵列,试试这个。 我看不到使用某种形式的 String 的方法,你将不得不使用 long,而不是 int。

int [] ar = {2, 15, 14, 10, 15, 21, 18};
long nbr = 0;
double multiplier = 1;
for(int i = ar.length-1; i >=0 ;i--) {
    nbr += ar[i] * multiplier;
    multiplier = Math.pow(10, String.valueOf(nbr).length());
}

如果您真的真的想避免使用 String (不知道为什么),我想您可以使用

multiplier = Math.pow(10,(int)(Math.log10(nbr)+1));

只要数组中的最后一个元素不为 0,它就可以工作。

使用这种方法,只要您的输入对于 int 来说太大,就使用 long。

long r = 0;
for(int i = 0; i < arr.length; i++)
{
    int offset = 10;
    if(arr[i] >= 10)
        offset = 100;
    r = r*offset;
    r += arr[i];
}

这将检查当前 int 是否大于 10 以将偏移量重置为 100 以获得所需的额外位置。 如果您包含大于 100 的值,您还需要添加额外的偏移量。


由于字符串的所有反对意见,将其放在我的帖子末尾......这是一个完全合法的答案......OP从未要求最有效的方法来做它只是想要一个答案

循环将数组附加到数组中的每个 int 的字符串,然后将字符串解析回 int

String s = "";
for(int i = 0; i < arr.length; i++)
       s += "" + arr[i];
int result = Integer.parseInt(s);

根据您的评论,您拥有的数字对于int来说太长了,您需要使用long

String s = "";
for(int i = 0; i < arr.length; i++)
       s += "" + arr[i];
long result = Long.parseLong(s);

如果您可以使用 Java 1.8,流 API 会非常简单:

@Test
public void arrayToNumber() {
    int[] array = new int[]{1,2,3,4,5,6};
    StringBuilder sb = new StringBuilder();

    Arrays.stream(array).forEach(element -> sb.append(element));

    assertThat(sb.toString()).isEqualTo("123456");
}

你可以那样做

public static int[] plusOne(int[] digits) {
    StringBuilder num= new StringBuilder();
    PrimitiveIterator.OfInt primitiveIterator = Arrays.stream(digits)
            .iterator();
    while (primitiveIterator.hasNext()) {
        num.append(primitiveIterator.nextInt());
    }
    int plusOne=Integer.parseInt(String.valueOf(num))+1;
    return Integer.toString(plusOne).chars().map(c -> c-'0').toArray();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM