计数并删除字符串列表中的重复项,但将重复计数添加到键中(任何惯用的java8方式?)
我有一个输入字符串(用计数并删除字符串列表中的重复项,但将重复计数添加到键中(任何惯用的java8方式?),java,java-8,java-stream,Java,Java 8,Java Stream,我有一个输入字符串(用和分隔),其中包含以下术语: GenericRequest.param[i] SpecificRequest.param[i]=XYZ GenericRequest.param[i] 我希望输出得到“合并”(并用&分隔),但有一点小小的扭曲: GenericRequest.param[i]=2 SpecificRequest.param[i]=XYZ 到目前为止,我可以.split(&)和.filter(s->s.endsWith(“[I]”),但这会导致我使用单个字符
和分隔),其中包含以下术语:
GenericRequest.param[i]
SpecificRequest.param[i]=XYZ
GenericRequest.param[i]
我希望输出得到“合并”(并用&
分隔),但有一点小小的扭曲:
GenericRequest.param[i]=2
SpecificRequest.param[i]=XYZ
到目前为止,我可以.split(&)
和.filter(s->s.endsWith(“[I]”)
,但这会导致我使用单个字符串;我需要对所有字符串进行可见性,以便我可以有效地计数重复项,删除重复项,然后将此额外的元数据位添加到相关键中(在本例中,计数generirequest.param[I]的重复项)
,删除重复项,并使用=2对其进行扩充
我可以通过构建过滤键的频率计数(以“[I]”“
”结尾)并将其添加到未过滤键的列表中来实现这一点,但我不知道如何以惯用的java8方式实现
编辑:以下是完整字符串的外观
generirequest.param[i]&specifirequest.param[i]=XYZ&generirequest.param[i]
以下是我迄今为止所尝试的:
String str = "GenericRequest.param[i]&SpecificRequest.param[i]=XYZ&GenericRequest.param[i]";
String result = Arrays.asList(str
.split("&"))
.filter(s -> s.endsWith("[i]");
.magic(?);
试试这个,首先按键分组并计算其值,然后将键和值映射到字符串
String str = "GenericRequest.param[i]&SpecificRequest.param[i]=XYZ&GenericRequest.param[i]";
Map<String, Long> map = Arrays.stream(str.split("&")).collect(Collectors.groupingBy(s -> s, Collectors.counting()));
System.out.println(map);
List<String> list = map.entrySet().stream().sorted(Map.Entry.comparingByKey())
.map(e -> e.getKey() + (e.getValue() == 1 ? "" : "=" + e.getValue())).collect(Collectors.toList());
System.out.println(list);
你能发布完整的代码吗?用字符串形式的输入文本样本和你使用的方法tried@Saravana我已经用实际的字符串编辑了我的文章,希望现在更清晰。
{SpecificRequest.param[i]=XYZ=1, GenericRequest.param[i]=2}
[GenericRequest.param[i]=2, SpecificRequest.param[i]=XYZ]