使用流java8基于条件修改HashMap
发布时间:2020-12-15 05:14:48 所属栏目:Java 来源:网络整理
导读:我想创建一个HashMap String,Integer来自现有的HashMap String,Integer通过对Map的键应用一些操作. 假设我有一个String- String sampleString= "SOSSQRSOP";` 然后通过从下面的字符串中只取3个字符(将0作为值)创建一个hashmap: MapString,Integer messages=
我想创建一个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”中查找不同字符的总数,并将no指定给每个键的值. Map<String,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); } } } }); )); 我收到编译错误.任何人都可以帮助我使用流编写代码. 编辑:还请描述其他方法来做到这一点.在我的例子中,BTW需要从给定的字符串创建第一个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() )); 但是,如果您已有地图并想要修改它,请使用replaceAll: messages.replaceAll( (s,unused) -> (int) IntStream.range(0,3) .filter(i -> "SOS".charAt(i) != s.charAt(i)) .count() ); 如果您的任务是拆分源消息并将每个三元组与前三个字符进行比较,则可以将它们组合在一个流表达式中: 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() )); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |