使用流java8基于条件修改HashMap

Nip*_*pun 3 java hashmap java-8 java-stream

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

String sampleString= "SOSSQRSOP";` 
Run Code Online (Sandbox Code Playgroud)

然后通过从下面的字符串中只取3个字符(将0作为值)创建一个hashmap:

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

实际任务是使用映射中的每个键从给定字符串"SOS"中查找不同字符的总数,并将no指定给每个键的值.如下(最终结果):

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

所以我使用下面给出的流在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);
                                        }
                                    }
                                }
                            });
                    ));
Run Code Online (Sandbox Code Playgroud)

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

编辑:还请描述其他方法来做到这一点.在我的例子中,BTW需要从给定的字符串创建第一个hashmap.

Mis*_*sha 5

没有必要预先制作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()
         ));
Run Code Online (Sandbox Code Playgroud)

但是,如果您已有地图并想要修改它,请使用replaceAll:

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

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

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()
        ));
Run Code Online (Sandbox Code Playgroud)