java - 如何替换任意数量的子字符串?

标签 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,我认为是因为第一个循环不会尝试替换第一个变量之外的内容。

最佳答案

首先我们需要知道格式是如何工作的,

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()]));

关于java - 如何替换任意数量的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33337778/

相关文章:

Java 转储一个对象

java - 使用 apache-poi java 验证不适用于 xlsx 文件

java - 在 WebSphere 服务器上使用 JNDI 的 Spring 自定义数据源连接

c - 将一个字符追加到列表中 n 次

Java:输入比较

batch-file - 在 cmd.exe 批处理文件中格式化十六进制序列

java - 附加变量进行 HTTP 调用时失败

java - 如何利用Spring MVC中的多线程概念进行后续操作

java - 如何计算算术表达式(字符串)并返回结果?

c# - 如何格式化带有千位分隔符和小数点逗号的字符串?