【问题标题】:Integer iteration Help java整数迭代帮助java
【发布时间】:2019-05-11 00:59:47
【问题描述】:

我目前遇到一个关于将整数数组组合成整数的问题。

我在 Way to combine integer array to a single integer variable? 上查看了其他几种方法,但我仍然不明白为什么会遇到错误。

我的目标是转弯:

[6, 2, 3, 3, 8, 7, 7, 7, 0, 1, 6]

进入

62338777016

它目前在给定较小的整数数组时有效,例如:

[1, 3, 4, 4]
-> 1344

一旦元素数量达到 10,它就会开始崩溃。 有人有可能的解决方案吗?

【问题讨论】:

  • 如果您的数字大于 Integer.MAX_VALUE,则必须使用 Long 或 BigInteger。
  • MAX_INT = 2147483647
  • 我可以使用 longs,但如果我使用 bigInteger,我该怎么做?
  • 您超出了最大整数限制。因此,您看到您的解决方案正在崩溃。正如 Eran 建议的那样,使用更好的数据类型,它支持更广泛的范围。
  • 有人可以给我一个关于在这种情况下如何使用 BigIntegers 的例子吗?我读过一些关于 BigIntegers 的文章,似乎它们限制了太多的功能

标签: java arrays concatenation


【解决方案1】:

你可以这样执行:

Integer[] arr = {6, 2, 3, 3, 8, 7, 7, 7, 0, 1, 6};
Long val = Long.valueOf(Arrays.stream(arr).map(String::valueOf).collect(Collectors.joining("")));

【讨论】:

    【解决方案2】:
    public static long convert(int[] arr) {
        long res = 0;
    
        for (int digit : arr) {
            // negative value is marker of long overflow
            if (digit < 0 || res * 10 + digit < 0)
                throw new NumberFormatException();
            res = res * 10 + digit;
        }
    
        return res;
    }
    

    这不是一个通用的方法,因为Long.MAX_VALUE。否则,您必须使用 BigInteger 而不是 long。

    public static BigInteger convert(int[] arr) {
        // reserve required space for internal array
        StringBuilder buf = new StringBuilder(arr.length);
    
        for (int digit : arr)
            buf.append(digit);
    
        // create it only once
        return new BigInteger(buf.toString());
    }
    

    【讨论】:

      【解决方案3】:

      在这里,您尝试使用超过最大值 2,147,483,647 的超过 10 位的整数,因此您可以使用以下代码进行细微更改,例如使用双精度数。

        Integer[] arr = new Integer[] { 6, 2, 3, 3, 8, 7, 7, 7, 0, 1, 6 };
          Double myData = 0d;
          for (int i = 0; i < arr.length; i++) {
              double productfactor = (Math.pow(10, (arr.length-1-i)));
              myData = myData+arr[i]*productfactor;
          }
          String formatted = new BigDecimal(Double.valueOf(myData)).toString();
      

      【讨论】:

        【解决方案4】:

        您正在溢出整数的最大大小 2147483647。解决此问题的一种方法是使用 BigInteger 而不是 int

        BigInteger bigInt = BigInteger.ZERO;
        for (int i : ints) {
            bigInt = bigInt.multiply(BigInteger.TEN).add(BigInteger.valueOf(i));
        }
        

        【讨论】:

        • 这不应该是反向迭代吗?
        • @HimanshuBhardwaj 没有。 OP 希望数组的第一个元素代表结果中最左边的数字。
        • @Mureinik 这个程序会直接从 int 数组中生成 62338777016 吗?我很困惑,因为我从未使用过 Big Integer
        • @chimmichanngas 差不多。您可以将BigInteger 视为一个非常大的int,它只使用multiplyadd 之类的方法,而不是*+ 之类的运算符。
        • 这对性能不利,因为要创建多个 BigInteger 实例。
        【解决方案5】:

        解决这个问题的一种可能方法,我假设所有整数都是正数。

        您可以将所有整数数组值连接成一个字符串并形成一个字符串。

        所以,[6, 2, 3, 3, 8, 7, 7, 7, 0, 1, 6] 变为 62338777016(字符串)。

        BigInteger 有一个构造函数 (https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#BigInteger(java.lang.String))

        您可以利用它来获取值的 BigInteger 表示形式。

        【讨论】:

          【解决方案6】:

          我们需要查看错误消息才能确定,但​​我的第一个猜测是您达到了 int (2,147,483,647) 的大小限制。

          【讨论】:

          • [6, 2, 3, 3, 8, 7, 7, 7, 0, 1, 6] 2147483647 [2, 3, 3, 8, 7, 7, 7, 0, 1 , 6, 5] 2147483647 [3, 3, 8, 7, 7, 7, 0, 1, 6, 5, 3] 2147483647 [3, 8, 7, 7, 7, 0, 1, 6, 5, 3 , 8] 2147483647 [8, 7, 7, 7, 0, 1, 6, 5, 3, 8, 8] 2147483647 [7, 7, 7, 0, 1, 6, 5, 3, 8, 8, 7 ] 2147483647 [7, 7, 0, 1, 6, 5, 3, 8, 8, 7, 3] 2147483647 [7, 0, 1, 6, 5, 3, 8, 8, 7, 3, 4] 2147483647
          • 数组为整型数组,后面的数字为组合元素个数
          • 您可以使用 long 或 BigInteger 但更重要的是您检查数组的大小并验证您没有溢出
          猜你喜欢
          • 2010-10-24
          • 2013-11-14
          • 1970-01-01
          • 1970-01-01
          • 2021-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多