当前位置: 首页 > 知识库问答 >
问题:

使用streams java8基于条件修改HashMap

司徒寒
2023-03-14

我想创建一个HashMap

String sampleString= "SOSSQRSOP";` 

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

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。


共有3个答案

司承业
2023-03-14

在IMO中,您最好不要使用Streams,而是replaceAll

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}

艾骏
2023-03-14

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

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;
                                      }));
严扬
2023-03-14

无需预先制作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()
);

如果您的任务是拆分源消息并将每个三元组与前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()
        ));
 类似资料:
  • 问题内容: 我想替换元素标签中的值,具体取决于它的值以及另一个元素的值(与所述元素处于同一级别),这两个元素到处都在同一个父元素标签中(每个父标签都是唯一的) (由于其自身的ID属性)。我想在存储过程中的此XML变量的各个位置进行更改。 作为第一次使用此计时器,我对如何修改整个xml中的元素感到困惑。这两个元素都存在于整个文档的同一父元素中,并且这些父标签中的每一个都有唯一的ID属性。 任何建议都

  • 我正在使用下面的XSLT- 可以有人请检查XSLT代码,帮助我得到想要的结果。当前,我得到以下错误数组([type]=>2[message]=>XSLTProcessor::TransformToxML():没有与此对象关联的样式表[file]=>/var/www/html/online-toolz.com/functions/xslt.php[line]=>26)错误:XSLTProcessor

  • 此问题与几天前发布的问题类似,将行从0折叠到0 与前一个问题不同的是,我们如何根据Id折叠那些时间差小于或等于60的行。 例如,使用相同的数据集 这将通过ID计算时差 这将导致如下所示的新列差异 现在只按< code >事件折叠行。身份证明..其中时间差小于或等于60,即< code>diff 正在寻找有关如何创建这种折叠数据集的帮助。提前谢谢。

  • 我有一个用于硒测试的pytest工作环境。我在conftest中使用了一个参数化的fixture。py允许我测试所有不同的浏览器,而无需重写测试。我想向脚本传递一个命令行参数,以便它只能运行特定的浏览器,而不是所有浏览器。为此,我需要修改传递到fixture中的变量。到目前为止,我还不知道如何做到这一点。下面的示例不起作用,可能是因为pytest解析conftest。py与我的启动脚本描述的变量分

  • 我有一个这样的df: 对于每个ID,我有5列A1到A5(实际上我有更多),并且这些值是特定ID的最高优先级。 例如:ID 1将A1、A3和A5作为优先级,ID 3只有2个A2和A1,ID 5没有优先级 合成DF 我尝试使用和使用这个和这个以及更多的方法来实现相同的功能,但无法获得相同的结果df。 这方面的任何帮助或我这边的清晰度!!

  • 问题内容: 我试图读取Golang中的JSON文件,修改此JSON文件,然后创建一个新的JSON文件/在此JSON文件上进行覆盖。我在网上看到了几个示例,但似乎无法将两个和两个放在一起以获得所需的结果。我尝试只在GO中创建自己的JSON str并对其进行修改,但仍然失败。 我已经尝试过几次读取文件,以下是我的最佳尝试: 这是一个示例输出: 我只是对如何修改我想要的内容感到困惑,特别是上述示例输出的