2017-09-22 3 views
2

Je travaille avec un code où je veux remplir plusieurs emplacements de chaîne avec d'autres chaînes. C'est le texte d'exemple que j'ai utilisé pour tester mon code.Java: comment remplir des espaces réservés dans un texte avec Map <String, String>?

String myStr = "Media file %s of size %s has been approved" 

C'est ainsi que je remplis les espaces réservés. Depuis que je compte utiliser plusieurs places, j'ai utilisé java Map <>.

Map<String, String> propMap = new HashMap<String,String>(); 
propMap.put("file name","20mb"); 
String newNotification = createNotification(propMap); 

J'ai utilisé la méthode suivante pour créer la chaîne. Comment remplacer deux '% s' par "nom de fichier" et "20mb"?

Répondre

0

Après avoir essayé plusieurs façons finalement trouvé un bon Solution. Les emplacements doivent être comme ceci [espace réservé].

public String createNotification(){ 
    Pattern pattern = Pattern.compile("\\[(.+?)\\]"); 
    Matcher matcher = pattern.matcher(textTemplate); 
    HashMap<String,String> replacementValues = new HashMap<String,String>(); 
    StringBuilder builder = new StringBuilder(); 
    int i = 0; 
    while (matcher.find()) { 
     String replacement = replacementValues.get(matcher.group(1)); 
     builder.append(textTemplate.substring(i, matcher.start())); 
     if (replacement == null){ builder.append(matcher.group(0)); }  
     else { builder.append(replacement); }  
     i = matcher.end(); 
    } 
    builder.append(textTemplate.substring(i, textTemplate.length())); 
    return builder.toString() 
} 
2

Votre approche de String#format est erronée.

Il s'attend à ce qu'une quantité variable d'objets remplace les espaces réservés en tant que second argument, et non une carte. Pour les regrouper tous, vous pouvez utiliser un tableau ou une liste.

String format = "Media file %s of size %s has been approved"; 

Object[] args = {"file name", "20mb"}; 
String newNotification = String.format(format, args); 
3

Ce n'est pas ce qu'une carte est destinée à faire. Ce que vous ajoutez est une entrée "file name" -> "20 mb", ce qui signifie que la propriété "nom de fichier" a la valeur "20 mb". Ce que vous essayez de faire avec c'est "maintenir un tuple d'articles".

Notez que la chaîne de formatage a une quantité fixe d'espace réservé; vous voulez une structure de données qui contient exactement le même nombre d'éléments; donc essentiellement un tableau ou un List.

Ainsi, ce que vous voulez avoir est

public String createNotification(String[] properties) { 
    assert(properties.length == 2); // you might want to really check this, you will run into problems if it's false 
    return String.format("file %s has size %s", properties); 
} 

Si vous voulez créer des notifications de tous les éléments d'une carte, vous devez faire quelque chose comme ceci:

Map<String,String> yourMap = //... 
for (Entry<String,String> e : yourMap) { 
    System.out.println(createNotification(e.getKey(), e.getValue())); 
} 
0

Je pense %s est la grammaire de Python pour placer le détenteur, ne peut pas l'utiliser dans l'environnement Java; et votre méthode createNotification() défini a besoin de deux paramètres, ne peut pas seulement en donner un.

+0

% s _can_ être utilisé en Java: https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax –

1

Vous pouvez simplement faire cette mise en forme en utilisant var-args:

String myStr = "Media file %s of size %s has been approved"; 

    String newNotification = createNotification(myStr, "file name", "20mb"); 

    System.out.println(newNotification); 

pass method var-args dans createNotification, voici le code:

public static String createNotification(String myStr, String... strings){ 
    String message = ""; 
    message=String.format(myStr, strings[0], strings[1]); 

    return message; 
} 
+0

Mais dans chaque cas, il y a un nombre différent des chaînes à remplacer. Par conséquent, je ne pense pas que cela puisse être utilisé. – sndu

+0

@Sandu_prass ceci est pour la chaîne donnée "Le fichier média% s de la taille% s a été approuvé", nous pouvons le rendre dynamique en apportant quelques modifications. –