Целочисленная итерация Помощь Java - PullRequest
0 голосов
/ 10 декабря 2018

У меня сейчас проблема с объединением целочисленного массива в целое число.

Я рассмотрел несколько других способов сделать это на Способ объединения целочисленного массива в одну целочисленную переменную?, но я до сих пор не понимаю, почему я сталкиваюсь с ошибками.

Моя цель - превратить:

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

в

62338777016

Это сейчасработает, когда заданы меньшие целочисленные массивы, такие как:

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

Он начинает разрушаться, когда число элементов достигает 10. Есть ли у кого-нибудь возможное решение?

Ответы [ 6 ]

0 голосов
/ 10 декабря 2018
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());
}
0 голосов
/ 10 декабря 2018

Здесь вы пытаетесь использовать целое число для более чем 10 цифр, которое превышает максимальное значение 2 147 483 647, поэтому вы можете использовать приведенный ниже код, который вносит незначительные изменения, например, использование двойного.

  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();
0 голосов
/ 10 декабря 2018

Вы можете выполнить это так:

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("")));
0 голосов
/ 10 декабря 2018

Ну, один из возможных способов решения этой проблемы, я предполагаю, что все целые числа положительны.

Вы можете объединить все значения целочисленного массива в строку и сформировать одну строку.

Итак, [6, 2, 3, 3, 8, 7, 7, 7, 0, 1, 6] становится 62338777016 (String).

BigInteger имеет конструктор (https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#BigInteger(java.lang.String))

, который вы можете использовать для получения представления значения BigInteger.

0 голосов
/ 10 декабря 2018

Вы переполняете максимальный размер целого числа 2147483647. Один из способов решения этой проблемы - использовать BigInteger вместо int:

BigInteger bigInt = BigInteger.ZERO;
for (int i : ints) {
    bigInt = bigInt.multiply(BigInteger.TEN).add(BigInteger.valueOf(i));
}
0 голосов
/ 10 декабря 2018

Нам нужно увидеть сообщение об ошибке, но я думаю, что вы достигнете предела размера int (2 147 483 647).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...