使用流填充映射与其字母位置对应的字母表的Java映射

使用流填充映射与其字母位置对应的字母表的Java映射,java,java-8,java-stream,Java,Java 8,Java Stream,我正在填充一个映射alphabetToNumber,该映射对应于字母位置的字母 char [] alphabetArray = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); Map<Character, Integer> alphabetToNumber = new HashMap<>(); int counter = 1; for(Character letter : alphabetArray) { alphabetT

我正在填充一个
映射
alphabetToNumber
,该映射对应于字母位置的字母

char [] alphabetArray = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
Map<Character, Integer> alphabetToNumber = new HashMap<>();
int counter = 1;
for(Character letter : alphabetArray) {
    alphabetToNumber.put(letter, counter);
    counter++;
}
char[]alphabetArray=“abcdefghijklmnopqrstuvxyz.toCharArray();
Map alphabetToNumber=newhashmap();
int计数器=1;
for(字符字母:alphabetArray){
字母计数器(字母、计数器);
计数器++;
}

上面的代码可以工作,但我想知道是否可以使用Java8流来完成。谢谢。

您可以使用
IntStream.range()
维护计数器,并使用
SimpleImmutableEntry
维护每个字母的两个信息:字母和顺序

char[] alphabetArray = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
Map<Character, Integer> alphabetToNumber =
        IntStream.range(0, alphabetArray.length)
                 .mapToObj(i -> new SimpleImmutableEntry<>(alphabetArray[i], i + 1))
                 .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
char[]alphabetArray=“abcdefghijklmnopqrstuvxyz.toCharArray();
地图字母编号=
IntStream.range(0,alphabetArray.length)
.mapToObj(i->新的simpleimutableentry(alphabetArray[i],i+1))
.collect(Collectors.toMap(e->e.getKey(),e->e.getValue());
Map result=IntStream.rangeClosed('A','Z'))
.boxed()
.collect(collector.toMap)(
x->(char)x.intValue(),
x->x+(1-‘A’);
或者,如果拳击/非拳击太多,效果更好:

Map<Character, Integer> result = IntStream.rangeClosed('A', 'Z')
    .collect(
        HashMap::new,
        (map, c) -> map.put((char) c, c + (1 - 'A')),
        HashMap::putAll
    );
Map result=IntStream.rangeClosed('A','Z'))
.收集(
HashMap::新建,
(map,c)->map.put((char)c,c+(1-‘A’),
HashMap::putAll
);
char[]alphabetArray=“abcdefghijklmnopqrstuvxyz”.toCharArray();
Map data=IntStream.range(0,alphabetArray.length).boxed()
.collect(Collectors.toMap(x->alphabetArray[x],x->x+1));
您可以使用获取一个
IntStream
,然后只需依赖这个事实并执行一点算术

Map <Character, Integer> alphabetToNumber = new HashMap<>();
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".chars()
    .forEach(ch -> alphabetToNumber.put((char) ch, ch - 'A' + 1));
Map alphabetToNumber=newhashmap();
“ABCDEFGHIJKLMNOPQRSTUVWXYZ”
.forEach(ch->alphabetToNumber.put((char)ch,ch-'A'+1));
Map alphabetToNumber=newhashmap();
AtomicInteger AtomicInteger=新的AtomicInteger(0);
“ABCDEFGHIJKLMNOPQRSTUVWXYZ”
.mapToObj(c->(char)c)
.forEach(c->alphabetToNumber.put(c,atomicInteger.getAndIncrement());

看看这个线程:我看到了,但我不确定如何使用变量
计数器
并从流中更新它。(64是'a'-1)或
mapToObj(I->new Pair(alphabetArray[I],I+1))
为什么要将
字符串
复制到
char[]
数组中,而不只是使用
charAt(x)
在函数中的
字符串上?根据问题,我认为他/她正在获取字符数组,需要将其转换为一个映射。我认为,问题的问题描述“映射对应于其字母位置的字母表”清楚地表明数组不是任务的一部分。OP可能使用了该数组,因为
for(char c:string)
不起作用(尽管保存源代码字符并不能证明复制整个字符串的运行时成本是合理的)。但在你的代码中,你无论如何都在索引上进行流式处理。
char [] alphabetArray = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

        Map<Character, Integer> data = IntStream.range(0, alphabetArray.length).boxed()
        .collect(Collectors.toMap( x -> alphabetArray[x], x -> x +1));
Map <Character, Integer> alphabetToNumber = new HashMap<>();
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".chars()
    .forEach(ch -> alphabetToNumber.put((char) ch, ch - 'A' + 1));
Map<Character, Integer> alphabetToNumber = new HashMap<>();
AtomicInteger atomicInteger = new AtomicInteger(0);
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".chars()
    .mapToObj(c -> (char) c)
    .forEach(c -> alphabetToNumber.put(c, atomicInteger.getAndIncrement()));