如何替换任意数量的子字符串?
How can I substitute an arbitrary number of substrings?
我正在研究基本的 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
class 现在很简单,
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
只是一个简单的 class,包含一个变量,msg
所以,我的想法是我想检索 RPC,它可能有可变数量的变量需要替换。有没有更优雅的方式(实际上有效)来做到这一点?我现在用 MissingFormatArgumentException
失败了,我假设是因为第一个循环不会尝试替换第一个变量之外的内容。
首先我们需要知道格式是如何工作的,
String x = String.format("%s %s","hello","world");
那么x会有"hello world"。但是如果我们这样做
String x = String.format("%s %s","hello");
它会给你一个非法参数异常,因为没有足够的参数来替换。
所以你需要一次传递所有参数。现在可变参数实际上是参数数组。所以你可以这样做。
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()]));
我正在研究基本的 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
class 现在很简单,
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
只是一个简单的 class,包含一个变量,msg
所以,我的想法是我想检索 RPC,它可能有可变数量的变量需要替换。有没有更优雅的方式(实际上有效)来做到这一点?我现在用 MissingFormatArgumentException
失败了,我假设是因为第一个循环不会尝试替换第一个变量之外的内容。
首先我们需要知道格式是如何工作的,
String x = String.format("%s %s","hello","world");
那么x会有"hello world"。但是如果我们这样做
String x = String.format("%s %s","hello");
它会给你一个非法参数异常,因为没有足够的参数来替换。
所以你需要一次传递所有参数。现在可变参数实际上是参数数组。所以你可以这样做。
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()]));