首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用streams java8根据条件修改HashMap

使用streams java8根据条件修改HashMap
EN

Stack Overflow用户
提问于 2018-06-12 14:45:43
回答 5查看 3.3K关注 0票数 3

我想通过在HashMap<String,Integer>的键上应用一些操作来从现有的Map键创建一个HashMap<String,Integer>。假设我有一个字符串->

代码语言:javascript
复制
String sampleString= "SOSSQRSOP";` 

然后创建了一个hashmap,只从字符串中提取3个字符,如下所示(将0作为值):

代码语言:javascript
复制
Map<String, Integer> messages= new HashMap<>();
messages.put("SOS",0); 
messages.put("SQR",0);
messages.put("SOP",0);

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

代码语言:javascript
复制
Map<String, Integer> messages= new HashMap<>();
messages.put("SOS",0);
messages.put("SQR",2);
messages.put("SOP",1);

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

代码语言:javascript
复制
    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);
                                        }
                                    }
                                }
                            });
                    ));

我得到了编译错误。有谁能帮我用stream写代码吗?

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

EN

回答 5

Stack Overflow用户

发布于 2018-06-12 15:00:15

没有必要预先生成HashMap。流收集器toMap将为您制作:

代码语言:javascript
复制
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()
         ));

但是,如果您已经拥有地图并希望对其进行修改,请使用replaceAll

代码语言:javascript
复制
messages.replaceAll(
        (s, unused) -> (int) IntStream.range(0, 3)
                .filter(i -> "SOS".charAt(i) != s.charAt(i))
                .count()
);

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

代码语言:javascript
复制
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()
        ));
票数 7
EN

Stack Overflow用户

发布于 2018-06-12 14:51:33

不能在值映射器中使用forEach,因为它不返回值。

代码语言:javascript
复制
String x = "SOS";
Map<String,Integer> result = messages
        .entrySet().stream()
        .collect(Collectors.toMap(e-> e.getKey(),
                                  e-> {
                                          int count = 0;
                                          for (int i = 0; i < characters.length; i++){
                                              if (e.getKey().charAt(i) != x.charAt(i)) {
                                                  count++;
                                              }
                                          }
                                          return count;
                                      }));
票数 4
EN

Stack Overflow用户

发布于 2018-06-12 14:56:02

IMO最多只能使用replaceAll,而不是使用Streams。

代码语言:javascript
复制
Map<String, Integer> messages = new HashMap<>();
// sample entries
messages.put("SOS", 0);
messages.put("SQR", 0);
messages.put("SOP", 0);

messages.replaceAll((k, v) -> {
    // calculate new value for each entry
    int diff = 0;
    for (int i = 0; i < "SOS".length(); i++) {
        if ("SOS".charAt(i) != k.charAt(i)) {
            diff++;
        }
    }
    return diff;
});
System.out.println(messages);

输出

{SQR=2,SOP=1,SOS=0}

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50810804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档