如何在java中实现模板(用list的元素替换字符串)。

时间:2016-02-01 14:14:31

标签: java arrays

我正在开发一个应用程序,其中我遇到了需要用字符串替换识别单词的要求,即替换模板中的实际数据。在这里我从arraylist获取数据,为此我实现了以下解决方案。

List<String> abc = new ArrayList<String>();
        abc.add("willy brown");
        abc.add("jamster");
        String message="//$^$// has commented on //$^$// .";
        String messages[] = message.split(" ");
        StringBuffer finalMessage = new StringBuffer();
        for(int i=0,j=0; i<messages.length && j<=abc.size(); i++){
            System.out.println("messages : " + messages[i]);
            if(messages[i].equals("//$^$//")){
                messages[i] = abc.get(j);
                System.out.println("after changes " +messages[i]);
                j++;
            }
            finalMessage.append(messages[i] +" ");
        }
        System.out.println("final message: " + finalMessage);

我只是想知道是否有更好的方法来实现这一点,以及是否存在任何漏洞。

2 个答案:

答案 0 :(得分:1)

我会使用MessageFormat.format:

    List<String> abc = new ArrayList<String>();
    abc.add("willy brown");
    abc.add("jamster");

    String message = "{0} has commented on {1}";
    String finalMessage = MessageFormat.format(message, abc.toArray(new String[abc.size()]));
    System.out.println(finalMessage);

答案 1 :(得分:0)

您可以使用内置的String和StringBuffer方法来执行此任务,而无需将消息拆分为数组。我还建议将您的字段标识符提取到单独的变量中。上帝禁止你错过它在某个地方打字!

    String fieldIdentifier = "//$^$//";

    List<String> abc = new ArrayList<>();
    abc.add("willy brown");
    abc.add("jamster");

    String message= fieldIdentifier + " has commented on "  + fieldIdentifier + ".";
    StringBuffer finalMessage = new StringBuffer(message);

    int fieldCount = 0;

    while(finalMessage.indexOf(fieldIdentifier) > -1) {
        int index = finalMessage.indexOf(fieldIdentifier);
        finalMessage = finalMessage.replace(index, index + fieldIdentifier.length(), abc.get(fieldCount));

        fieldCount++;
    }

    System.out.println("final message: " + finalMessage);

编辑:使用StringBuffer进行这些操作是非常可取的,因为它比使用String更可变且更快。