gpt4 book ai didi

java - 使用流java8根据条件修改HashMap

转载 作者:搜寻专家 更新时间:2023-11-01 04:07:21 25 4
gpt4 key购买 nike

我想创建一个 HashMap<String,Integer>来自现有的 HashMap<String,Integer>通过对 map 的键应用一些操作。假设我有一个 String->

String sampleString= "SOSSQRSOP";` 

然后通过仅从如下字符串中提取 3 个字符(将 0 作为值)来创建 HashMap :

Map<String, Integer> messages= new HashMap<>();
messages.put("SOS",0);
messages.put("SQR",0);
messages.put("SOP",0);

实际任务是从给定字符串“SOS”中找到映射中每个键的不同字符的总数,并将编号分配给每个键的值。如下所示(最终结果):

Map<String, Integer> messages= new HashMap<>();
messages.put("SOS",0);
messages.put("SQR",2);
messages.put("SOP",1);

所以我使用下面给出的流在 java8 中编写了代码:

    Map<String,Integer>  result= messages
.entrySet().stream()
.collect(Collectors.toMap(e-> e.getKey(),
e-> e.getKey().stream()
.forEach(x-> {
if(!"SOS".equals(x)){
char[] characters= {'S','O','S'};
char[] message= x.toCharArray();
for(int i=0; i< characters.length;i++){
int index=0;
if(characters[i] != message[i]){
messages.put(e.getKey(),++index);
}
}
}
});
));

我遇到编译错误。任何人都可以帮助我使用流编写代码。

已编辑:另请描述执行此操作的其他方法。顺便说一句,在我的例子中需要从给定的字符串创建第一个 HashMap 。

最佳答案

无需预先制作HashMap。流收集器 toMap 将为您完成:

import static java.util.stream.Collectors.toMap;

Map<String, Integer> result = Stream.of("SOS", "SQR", "SOP")
.collect(toMap(
s -> s,
s -> (int) IntStream.range(0, 3)
.filter(i -> "SOS".charAt(i) != s.charAt(i)) // assume all words are 3-letters
.count()
));

但是,如果您已经有了 map 并想修改它,请使用replaceAll:

messages.replaceAll(
(s, unused) -> (int) IntStream.range(0, 3)
.filter(i -> "SOS".charAt(i) != s.charAt(i))
.count()
);

如果您的任务是拆分源消息并将每个三元组与前 3 个字符进行比较,您可以将它们全部组合在一个流表达式中:

String message = "SOSSQRSOP";
int n = 3;

assert message.length() % n == 0;

Map<String, Integer> messages = IntStream.range(0, message.length() / n)
.map(i -> i * n) // starting points of the n-grams
.mapToObj(idx -> message.substring(idx, idx + n))
.collect(toMap(
group -> group,
group -> (int) IntStream.range(0, n)
.filter(i -> message.charAt(i) != group.charAt(i))
.count()
));

关于java - 使用流java8根据条件修改HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50810804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com