流减少错误使用长类型

时间:2017-08-27 11:47:30

标签: java java-stream

我想将字符串行转换为长数字。 我这样做:

 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的值没有正常工作。

1 个答案:

答案 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"