2017-08-01 1 views
1
Map<String,Object> inputMap=new HashMap<String,Object>(); 

    inputMap.put("a","abc"); 
    inputMap.put("b","bcd"); 
    inputMap.put("c","cde"); 

HashMap<String,String> subMap=new HashMap<String,String>(); 
    subMap.put("x","xyz"); 
    subMap.put("z","klm") 

    inputMap.put("d",subMap); 




String output=inputMap.toString(); 
System.out.println(output); 


{a=abc,b=bcd,c=cde,d={x=xyz,z=klm}} 

la sortie est la suivante: {a = abc, b = bcd, c = cde, d = {x = xyz, z = klm}}; Comment puis-je convertir la sortie en Carte?Je convertis une carte en chaîne en utilisant la méthode toString(). Est-il possible de convertir la chaîne en carte?

Merci d'avance.

+1

double possible de [Convertir chaîne représentant des paires clé-valeur à la carte] (https://stackoverflow.com/questions/14768171/convert-string-representing-key- value-pairs-to-map) –

+0

Essayez d'utiliser la méthode clear(). Il supprime toutes les paires clé/valeur de la carte invoquante. – Tehmina

+0

Voici une solution: https://stackoverflow.com/a/17278809/1270000 – sorifiend

Répondre

1

Y a-t-il un moyen de convertir la chaîne en carte?

En général, n °

  1. Les Map<K,V>.toString() mises en œuvre reposent sur les implémentations K.toString() et V.toString(). Ceux-ci ne sont pas réversibles, ce qui signifie que l'implémentation Map ne peut pas l'être non plus.

  2. Même dans le cas Map<String,String>, la carte rendue n'utilise aucune forme d'échappement pour gérer les cas de contour ... comme les clés ou les valeurs qui contiennent des virgules, des accolades ou des accolades.

Dans les cas restreints , vous pourriez mettre en œuvre votre propre analyseur, ou vous pouvez utiliser l'une des approches décrites ici:

Cependant, C'est une mauvaise idée d'utiliser toString() si vous avez également besoin que la transformation soit réversible. Le contrat de méthode toString() et sa mise en œuvre ne sont pas conçus à cette fin. Ils sont principalement conçus pour une utilisation dans le débogage.


1 - Par exemple, si vous pouvez supposer que K et V sont String, il n'y a pas null clés ou des valeurs, et ne contiendra des caractères maladroits.

2 - Attention: les solutions simples utilisant split ne prennent souvent pas en charge les cartes imbriquées.

0

Il n'y a pas de méthode Java prédéfinie Mais vous pouvez coder avec votre propre logique. Ici, je partage mon exemple de travail. Vous pouvez modifier votre code au besoin

String output="{a=abc,b=bcd,c=cde,d={x=xyz,z=klm}}"; 
    if(output.indexOf("{")==0 && output.lastIndexOf("}")==output.length()-1) { 
      output=output.substring(1, output.length()-1); 
     HashMap<String, String> convertedMap=convert(output); 
     for (HashMap.Entry<String, String> value:convertedMap.entrySet()) { 
      if(value.getValue().indexOf("{")==0 && value.getValue().lastIndexOf("}")==value.getValue().length()-1) { 
       String valueWithBracket=value.getValue(); 
       convertedMap.remove(value); 
       convertedMap=convert(valueWithBracket); 
      } 
     } 
    } 

    public static HashMap<String, String> convert(String str) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
     String[] tokens = str.split(",(?![^{)]*\\})"); 
    for (String token: tokens) { 
     String[] val=token.split("=(?![^{)]*\\})"); 
     for (int i=0;i<val.length;i=i+2) { 
      map.put(val[i], val[i+1]); 
     } 
    } 
     return map; 
} 
public static HashMap<String, String> removeBracketAndConvert(String str){ 
    if(str.indexOf("{")==0 && str.lastIndexOf("}")==str.length()-1) { 
     str=str.substring(1, str.length()-1); 
     return convert(str); 
    } 
    return convert(str); 
}