Java:如何使用Map <string,string>填充文本中的占位符?

时间:2017-09-22 09:29:37

标签: java string hashmap mapping placeholder

我正在处理一个代码,我希望用另一个字符串填充几个字符串占位符。这是我用来测试代码的示例文本。

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

这就是我填充占位符的方式。由于我希望使用多个占位符,因此我使用了java Map&lt;&gt;。

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

我使用以下方法创建字符串。

public String createNotification(Map<String, String> properties){
    String message = ""; 
    message = String.format(myStr, properties);

    return message;
}

如何更换两个&#39;%s&#39;用&#34;文件名&#34;和&#34; 20mb&#34;?

5 个答案:

答案 0 :(得分:3)

这不是地图的目的。 您添加的是条目"file name" -> "20 mb",这基本上意味着属性“文件名”的值为“20 mb”。你要做的就是“保持一个项目元组”。

请注意,格式化字符串具有固定数量的占位符;你想要一个包含完全相同数量的项目的数据结构;所以基本上是一个数组或List

因此,您想拥有的是

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);
}

如果要创建地图中所有项目的通知,则需要执行以下操作:

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

答案 1 :(得分:2)

您对String#format的态度是错误的。

它期望可变数量的对象将占位符替换为第二个参数,而不是地图。要将它们组合在一起,您可以使用数组或列表。

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

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

答案 2 :(得分:1)

您只需使用var-args进行格式化:

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

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

    System.out.println(newNotification);

createNotification方法中传递var-args,这是代码:

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

    return message;
}

答案 3 :(得分:0)

我认为%s是Python的语法持有者,不能在Java环境中使用它;并且你的方法createNotification()定义了两个参数,不仅可以给一个。

答案 4 :(得分:0)

尝试了几种方法后终于找到了一个很好的解决方案。占位符必须与[占位符]类似。

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()
}