2016-11-08 49 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

相關問題