public static int reverse(int n) {
int result = 0;
while (n > 0) {
result = result * 10 + n % 10;
n = n / 10;
}
return result;
}
我试图扭转整数的数字。而不是像我所做的那样做代码,还有其他方法吗?我可以使用java流来反转它吗?
好的,这是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,则反转结果将溢出。
它也不支持负面输入。
另一种方式
int digits = 12345;
StringBuilder buf = new StringBuilder(String.valueOf(digits));
System.out.println(buf.reverse());
System.out.println(Integer.valueOf(buf.toString()));
还有一个流和数学乐趣实现。
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);
}
无论如何,你应该在你的方法中返回很长时间。但StringBuilder在这里是最好的。
一个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
除了其他答案,您也可以尝试此实现。
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
不起作用(因为那些被视为八进制),使用尾随零,应该没有负面(但需要进一步测试)。
反转整数的一种简单方法是将其解析为字符串,将其反转,然后将其解析为整数。
public static int reverse(int num) {
StringBuffer stringBuffer = new StringBuffer(String.valueOf(num););
stringBuffer.reverse();
return Integer.parseInt(stringBuffer.toString());
}