2017-08-27 59 views
0

我想將字符串行轉換爲長數字。 我這樣做:流減少錯誤地使用長型

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

你的降價幅度不是[關聯](https://docs.oracle.com/javase/8/docs/api/java/util/stream/包summary.html#關聯性)。 – shmosel

+0

@shmosel,我該如何解決它? –

回答

1

問題是您在reduce操作中使用整數,因此您達到Integer.MAX_VALUE會給出錯誤結果。在charToInt地圖使用長的路要走:

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"