2017-01-05 4 views
3

Ich möchte unter String teilen und es in HashMap speichern.Split-String und speichern Sie es in HashMap Java 8

String responseString = "name~peter-add~mumbai-md~v-refNo~"; 

erste aufgespalten I die Zeichenfolge delimeter Bindestrich verwendet (-) und in Array Speicher wie unten:

public static List<String> getTokenizeString(String delimitedString, char separator) { 
    final Splitter splitter = Splitter.on(separator).trimResults(); 
    final Iterable<String> tokens = splitter.split(delimitedString); 
    final List<String> tokenList = new ArrayList<String>(); 
    for(String token: tokens){ 
     tokenList.add(token); 
    } 
    return tokenList; 
} 
List<String> list = MyClass.getTokenizeString(responseString, "-"); 

und dann den folgenden Code zu konvertieren unter Verwendung von Strom Hashmap.

HashMap<String, String> = list.stream() 
          .collect(Collectors.toMap(k ->k.split("~")[0], v -> v.split("~")[1])); 

Der Stromabnehmer funktioniert nicht, da es keinen Wert gegen refNo gibt.

Es funktioniert korrekt, wenn ich gerade Anzahl der Elemente in ArrayList habe.

Gibt es eine Möglichkeit, damit umzugehen? Ich schlage auch vor, wie ich Stream verwenden kann, um diese beiden Aufgaben zu tun (ich möchte nicht getTokenizeString() -Methode verwenden) mit Stream Java 8.

Antwort

6

Es sei denn, Splitter ist jede Magie zu tun, die getTokenizeString Methode ist hier überflüssig. Sie können die gesamte Verarbeitung in einem einzigen Vorgang durchführen:

Map<String,String> map = Pattern.compile("\\s*-\\s*") 
    .splitAsStream(responseString.trim()) 
    .map(s -> s.split("~", 2)) 
    .collect(Collectors.toMap(a -> a[0], a -> a.length>1? a[1]: "")); 

durch den regulären Ausdruck \s*-\s* als Trennzeichen verwenden, können Sie white-space als Teil des Separators in Betracht ziehen, damit implizit die Einträge trimmen. Es gibt nur eine initiale Operation trim vor der Verarbeitung der Einträge, um sicherzustellen, dass vor dem ersten oder nach dem letzten Eintrag kein Leerzeichen vorhanden ist.

Dann teilen Sie einfach die Einträge in einem map Schritt vor dem Sammeln in eine Map.

+0

Vielen Dank für Ihre schnelle und funktionierende Antwort. Arbeiten wie Charme. –

2

Vor allem müssen Sie nicht die gleiche String zweimal teilen.
Zweitens überprüfen Sie die Länge des Arrays, um festzustellen, ob ein Wert für einen bestimmten Schlüssel vorhanden ist.

HashMap<String, String> = 
    list.stream() 
     .map(s -> s.split("~")) 
     .collect(Collectors.toMap(a -> a[0], a -> a.length > 1 ? a[1] : "")); 

Dies wird vorausgesetzt, Sie den Schlüssel mit einem null Wert setzen möchten, wenn ein Schlüssel keinen entsprechenden Wert hat.

Oder Sie können die list Variable überspringen:

HashMap<String, String> = 
    MyClass.getTokenizeString(responseString, "-") 
     .stream() 
     .map(s -> s.split("~")) 
     .collect(Collectors.toMap(a -> a[0], a -> a.length > 1 ? a[1] : "")); 
+0

Vielen Dank für Ihre schnelle Antwort. Es scheint, dass es nur auf ~ und nicht auf Bindestrich aufgeteilt wird. und wie kann ich die erste getTokenizeString() Methode loswerden. –

+0

Ich habe Ihren Code ausprobiert. Er löst NullPointerException aus. es funktioniert nur für eine gerade große Liste. –

+1

@SangamBelose In diesem Code wird davon ausgegangen, dass Sie "List list = MyClass.getTokenizeString (responseString," - ");' – Eran

Verwandte Themen