Как поменять цифры целого числа? - PullRequest
0 голосов
/ 12 октября 2018
public static int reverse(int n) {
    int result = 0;
    while (n > 0) {
        result = result * 10 + n % 10;
        n = n / 10;
    }
    return result;
}

Я пытаюсь поменять цифры целого числа.Вместо того, чтобы делать коды, как то, что я сделал, есть ли другой способ сделать это?Могу ли я отменить это с помощью потока Java?

Ответы [ 6 ]

0 голосов
/ 16 октября 2018

Простой способ инвертировать целое число состоит в том, чтобы разобрать его в строку, обратить его обратно и снова разобрать в целое число.

public static int reverse(int num) {
    StringBuffer stringBuffer = new StringBuffer(String.valueOf(num););
    stringBuffer.reverse();
    return Integer.parseInt(stringBuffer.toString());
}
0 голосов
/ 12 октября 2018

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

public class MyStreamReverser {

    public static void main(String[] args) {
        streamApiReverser(-9008);

        // other outputs to test:
        // streamApiReverser(20000090);
        // streamApiReverser(-04);
        // streamApiReverser(39-02);
    }

    private static void streamApiReverser(int n) {
        // produce an array of strings each having one digit
        String[] stringArray = String.valueOf(n).split("\\B");
        Stream<String> stringStream = Arrays.stream(stringArray);
        stringStream.collect(Collectors.toCollection(LinkedList::new))
                .descendingIterator()
                .forEachRemaining(System.out::println);
    }
}

Вывод:

8
0
0
-9

Примечание - не очень хорошо работает с ведущими нулями.09 не работает (так как они обрабатываются как восьмеричные), работает с конечными нулями, должно быть хорошо с отрицательными значениями (но необходимо дополнительное тестирование).

0 голосов
/ 12 октября 2018

Еще один поток и реализация Math fun.

public static long reverse(int n) {
    return Stream.iterate(
            Map.entry(0, n % 10),
            entry -> Math.pow(10, entry.getKey()) <= n,
            entry -> Map.entry(entry.getKey() + 1,
                    (int) (n % (int) Math.pow(10, entry.getKey() + 2) / Math.pow(10, entry.getKey() + 1))))
            .map(Map.Entry::getValue)
            .map(Integer::longValue)
            .reduce(0L, (r, i) -> r * 10 + i);
}

В любом случае, вы должны возвращать long в вашем методе.Но StringBuilder здесь лучший.

0 голосов
/ 12 октября 2018

A Stream решение, которое возвращает для заданного числа перевернутое String:

int n = 10101010;
String reveresed = String.valueOf(n)
        .chars()
        .mapToObj(Character::getNumericValue)
        .reduce("", (l, r) -> r + l, (l, r) -> l + r);
System.out.println(reveresed); // 01010101

Если мы конвертируем перевернутое String в Integer и напечатаем его, мы потеряем ведущиеноль:

System.out.println(Integer.valueOf(reveresed).toString()); // 1010101
0 голосов
/ 12 октября 2018

ОК, вот забавная реализация с IntStream:

public static int reverse (int n) {
     return IntStream.iterate (n, i -> i/10) // produces a infinite IntStream of n, n/10, 
                                             // n/100, ...
                     .limit(10) // 10 elements are sufficient, since int has <= 10 digits
                     .filter (i -> i > 0) // remove any trailing 0 elements
                     .map(i -> i % 10) // produce an IntStream of the digits in reversed 
                                       // order
                     .reduce (0, (r,i) -> r*10 + i); // reduce the reversed digits back
                                                     // to an int
}

Например, для входа 123456789 сначала будет сгенерировано бесконечное IntStream:

123456789,12345678,1234567,123456,12345,1234,123,12,1,0,0,...

Ограничив 10 элементов и удалив 0, мы получим:

123456789,12345678,1234567,123456,12345,1234,123,12,1

После сопоставления каждого элемента его последней цифре мы получим:

9,8,7,6,5,4,3,2,1

Теперь нам осталось толькоуменьшите IntStream аналогично тому, что вы делали в своем вопросе - добавьте каждый элемент к промежуточному результату, умноженному на 10:

((((0 * 10 + 9) * 10 + 8) * 10 + 7) * 10 ....) * 10 + 1

Обратите внимание, что если входной номер состоит из 10 цифр и последней цифры> 1, обратный результат будет переполнен.

Он также не поддерживает отрицательный ввод.

0 голосов
/ 12 октября 2018

Другой способ будет

int digits = 12345;
StringBuilder buf = new StringBuilder(String.valueOf(digits));
System.out.println(buf.reverse());
System.out.println(Integer.valueOf(buf.toString()));
...