我想将字符串行转换为长数字。 我这样做:
String line = "eRNLpuGgnON";
char[] chars = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-_".toCharArray();
Map<Character, Integer> charToInt =
IntStream.rangeClosed(0, chars.length - 1)
.boxed()
.collect(Collectors
.toMap(i -> (chars[i]), i -> i));
long l = line.chars()
.mapToObj(i -> (char) i)
.map(charToInt::get)
.reduce((int) 0L, ((a, b) -> a * chars.length + b));
System.out.println(l);
我通过符号在地图中取相应的索引,并执行乘法和加法的最短操作。
实施例。我有一行eRNLpuGgnON。这些符号在Map
:
e=2
R=29
N=50
....
算法非常简单:
0*64+2 = 2
2*64 + 29 = 157
157*64 + 50 = 10098
........
最后,我需要得到这个值:
2842528454463293618
但我得到了这个值:
-1472624462
而且,如果line
的值足够短,一切正常。我无法理解为什么Long的值没有正常工作。
答案 0 :(得分:1)
问题是您在reduce操作中使用整数,因此您到达Integer.MAX_VALUE会给出错误的结果。在您的charToInt地图中使用long是可行的方法:
Map<Character, Long> charValues = IntStream.range(0, chars.length)
.boxed()
.collect(Collectors.toMap(i -> chars[i], Long::valueOf));
long l = line.chars()
.mapToObj(i -> (char) i)
.map(charValues::get)
.reduce(0L, (a, b) -> a * chars.length + b);
System.out.println(l);
// prints "2842528454463293618"