Char数组使用Stream映射

时间:2017-08-26 19:36:16

标签: java java-stream

我是一个char数组:

private char[] chars = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-_".toCharArray();

当key是char符号时,我想得到Map,而value是数组中的char。像这样:

{q=0, w=1,....}

我想使用Stream api

Map<Character, Integer> charToInt = IntStream.rangeClosed(0, chars.length)

但我不明白下一步该做什么

3 个答案:

答案 0 :(得分:1)

您可以通过这种方式使用String代替其charArray

private String s = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-_";

然后像这样创建Map

Map<Character, Integer> charToInt = s.chars()
                                     .mapToObj(i -> (char) i)
                                     .collect(Collectors.toMap(c -> c, c -> s.indexOf(c)));

所以创建一个Map智慧为key char,并valueString

中的索引

答案 1 :(得分:1)

如果您想使用IntStream

Map<Character, Integer> charToInt = 
                    IntStream.rangeClosed(0, chars.length-1)
                             .mapToObj(i -> Integer.valueOf(i)))
                             .collect(Collectors
                                      .toMap(i -> Character.valueOf(chars[i]), i -> i));

答案 2 :(得分:1)

  

P.S。我之前有类似的答案。但是我   保持它作为替代,使用Pair类。

要解决此问题,您必须实现Pair类或使用任何可用的实现(例如我给您最简单的实现):

final class Pair {
    private char ch;
    private int pos;

    public Pair(char ch, int pos) {
        this.ch = ch;
        this.pos = pos;
    }

    public char getChar() {
        return ch;
    }

    public int getPos() {
        return pos;
    }
}

然后你可以使用流来解决你的问题:

Map<Character, Integer> res = IntStream.range(0, chars.length)
         .mapToObj(pos -> new Pair(chars[pos], pos))
         .collect(Collectors.toMap(Pair::getChar, Pair::getPos));