如何替换任意数量的子串?

时间:2015-10-26 02:53:00

标签: java string string-formatting

我正在进行基本的RPC设计。从侦听器中,我检索所需的RPC,如:

ArrayList<String> params = new ArrayList<String>();
params.add(Node.getLocal().getHostname());
params.add("test");
RPC rawRPC = StorageControl.getRPC(StorageControl.RPC_HelloMaster, params));

我的StorageControl课程现在非常简单,

public class StorageControl {
    public StorageControl(){
        availableRPCs.put(RPC_HelloMaster, new RPC("[%s] Hello, Master. [%s]"));
    }

    public static final String RPC_HelloMaster = "helloMaster";

    private static String MasterHostname;
    public static String getMaster(){ return MasterHostname; }
    public static void setMaster(String host){ MasterHostname = host; }

    private static Map<String, RPC> availableRPCs = new HashMap<String, RPC>();
    public static RPC getRPC(String key, ArrayList<String> params) {
        RPC rawRPC = availableRPCs.get(key);

        // This is what fails
        for (String param : params){
            rawRPC.msg = String.format(rawRPC.msg, param);
        }

        return rawRPC;
    }
}

RPC只是一个简单的类,包含一个变量msg

所以,我的想法是我想要检索RPC,它可能有需要替换的可变数量的变量。有更优雅的方式(实际上有效)吗?我现在用MissingFormatArgumentException失败了,我假设因为第一个循环没有尝试替换第一个变量。

1 个答案:

答案 0 :(得分:1)

首先,我们需要知道格式的工作原理,

String x = String.format("%s %s","hello","world");

然后x将有“hello world”。但是,如果我们这样做

String x = String.format("%s %s","hello"); 

它会给你一个非法的参数异常,因为没有足够的参数来替换。

所以你需要立刻传递所有参数。现在变量参数实际上是args数组。所以你可以这样做。

String stringToFormat = "%s %s %s";
String[] ags = {"hello","world","gg"};
stringToFormat = String.format(stringToFormat,ags);
System.out.println(stringToFormat);

在您的情况下,您可以在没有循环的情况下执行此操作

rawRPC.msg = String.format(rawRPC.msg, params.toArray(new String[params.size()]));