2010-11-04 7 views
6

Ich bin auf der Suche nach dem Gegenteil von Karte Schreiner in Google-Sammlungen. Gibt es so etwas und wenn nicht warum?gibt es eine Zeichenfolge zu Karte Splitter in Google-Sammlungen

EDIT: hier ist ein Beispiel, wie ich es wünsche wäre:

Map<String,String> myMap = Splitter.on(",").keyValueSeparator("=").split("k1=v1,k2=v2"); 

EDIT: öffnete ich ein request und es umgesetzt wurde. wird in Guava R10 verfügbar sein.

+0

Sie meinen, zu analysieren ein String zu einer Karte? Und bitte, fügen Sie die Guave-Tag –

Antwort

2

Ich denke, es gibt keine solche Funktion in Guave. Der Grund dafür ist, dass der Eintrag String viele Formate haben kann, so dass Sie einen eigenen "Parser" für Ihr eigenes Format erstellen müssen. An (hässlich) Alternative könnte dies sein, wenn Sie das Format der Eingabe-String ändern können:

final String toSplit = "k1=v1" + getProperty("line.separator") + "k2=v2"; 
final Properties properties = new Properties(); 
properties.load(new ByteArrayInputStream(toSplit.getBytes(Charsets.UTF_8))); 
Maps.fromProperties(properties); 
+0

aber das Problem der Analyse wurde bereits von der Splitter – oshai

+0

ja gerichtet, aber der Splitter ist nicht SplitterAndMapMaker. Mit Ihrem "keyValueSeparator" ist es kein Splitter mehr. Sie können jedoch eine Anfrage unter http://code.google.com/p/guava-libraries/issues/list stellen und auf Guavaers-Antworten warten. –

+0

+1 für den Link – oshai

1

Es ist ganz trivial ist Ihre eigene Rolle:

// assumes that input is properly formed e.g. "k1=v1,k2=v2" 
public Map<String, String> toMap(String input) { 
    Map<String, String> map = new HashMap<String, String>(); 
    String[] array = input.split(","); 
    for (String str : array) { 
     String[] pair = str.split("="); 
     map.put(pair[0], pair[1]); 
    } 
    return map; 
} 
5

Hier ist eine Klasse Maps2, die eine Methode

Map<String, String> mapSequence(String) 

Es bietet auch zwei überladene Methoden bietet, wo Sie die Trennzeichen ändern können, die a) zwischen Schlüssel und Werte (Standard verwendet: =) und b) zwischen den Einträgen (Standard: ,). Guava-Klassen wie Splitter und Iterables werden intern verwendet, um die Arbeit zu erledigen. Die zurückgegebene Karte ist eine , daher wird die Reihenfolge beibehalten.

public final class Maps2{ 

    public static final String DEFAULT_ENTRY_DELIMITER = ","; 
    public static final String DEFAULT_KEYVALUE_DELIMITER = "="; 

    private Maps2(){} 

    public static Map<String, String> mapSequence(final String sequence){ 
     return mapSequence(sequence, DEFAULT_KEYVALUE_DELIMITER); 
    } 

    public static Map<String, String> mapSequence(final String sequence, 
     final String keyValueDelim){ 
     return mapSequence(sequence, keyValueDelim, DEFAULT_ENTRY_DELIMITER); 
    } 

    public static Map<String, String> mapSequence(final String sequence, 
     final String keyValueDelim, final String entryDelim){ 

     final Splitter entrySplitter = Splitter.on(entryDelim) 
                .trimResults(); 
     final Splitter keyValueSplitter = Splitter.on(keyValueDelim) 
                .trimResults(); 
     final Map<String, String> map = Maps.newLinkedHashMap(); 
     for(final String token : entrySplitter.split(sequence)){ 
      final String[] items = 
       Iterables.newArray(
        keyValueSplitter.split(token), String.class); 
      if(items.length != 2){ 
       throw new IllegalArgumentException(
        "Map String not well-formed"); 
      } 
      map.put(items[0], items[1]); 
     } 
     return map; 
    } 

} 

Prüfregeln:

public static void main(final String[] args){ 
    // note the randomly spread whitespace in the test code, 
    // also the last entry has no value. 
    // using Splitter().trimResults() we can handle junk like that 
    final Map<String, String> map = Maps2.mapSequence("k1=v1 ,k2=v2, k3 ="); 
    System.out.println(map); 
} 

Ausgang:

{k1 = v1, k2 = v2, k3 =}

+0

& @Peter Knego - Ihre zwei Lösungen erlaubt keinen Wert mit Gleichheitszeichen (z. B. "k1 = v1 = s, k2 = v2"). Anstatt einen zweiten Splitter zu verwenden, sollten Sie die Funktion String.split mit limit arg token.split (keyValueDelim, 2) verwenden (BTW: Ich lasse kein Komma als Wert zu :)) – ekeren

+1

Ich stimme nicht zu, das würde zu unvorhersehbaren und unzuverlässigen Ergebnissen führen (Was ist, wenn das = im Schlüssel ist, nicht der Wert?). Ich denke, es ist besser, schnell zu versagen, und nein: Eine einfache Funktion wie diese kann keine sehr komplexen Strings abbilden. Verwenden Sie JSON, wenn Sie mehr Komplexität wünschen. –

+0

hast du mich einfach überzeugt – ekeren

Verwandte Themen