2016-11-08 48 views
1

我有一个输入字符串(与&分隔)包含以下条款(任何惯用java8式的方式?):计数并删除重复的字符串列表,但添加的副本计数的关键

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],删除重复,并与=2增强它。

我可以通过建立过滤键(与"[i]"结束),并补充说,未经过滤的关键字列表的频率计数做到这一点,但我只是不知道如何做到这一点的一种惯用方式java8。

编辑:这是一个完整的字符串看起来像

GenericRequest.param[i]&SpecificRequest.param[i]=XYZ&GenericRequest.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(?); 
+1

你能发布完整的代码吗?与字符串中的输入文本的样本和您尝试的方法 – Saravana

+0

@Saravana我已经用实际的字符串编辑了我的帖子,希望它现在更清晰。 – BSJ

回答

2

试试这个,首先感到的关键分组计数的值,然后映射键和值的字符串

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); 

输出

{SpecificRequest.param[i]=XYZ=1, GenericRequest.param[i]=2} 
[GenericRequest.param[i]=2, SpecificRequest.param[i]=XYZ] 
+0

甜蜜,那有效! – BSJ

相关问题