[英]Java: How to “mutate” a string, despite a string's immutability?
我正在开发一个API作为一个学生的爱好项目,我正在使用一个网址,可以添加/减少不同的选项来更改收到的信息。 我知道字符串是不可变的,这使得整齐地解决问题变得有些困难。 我想出了一些混乱的方法,没有一个是强大的,解决它,我想知道是否有标准的方法。 我计划让单选按钮(未分配给一个按钮组;想要所有排列),这将允许我“包含”,“添加”和“排除”选项。
因此,这里是用于与YahooFinance API交互的字符串z?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14
w14。 所以,假设我有一些像这样的变量:
String options="z?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14"
现在,考虑一下p=e50,m50
。 假设我有三个单选按钮50
, 100
, 200
,我想剔开/关,使得我有一个字符串p=e50,m50,e100,m100,e200,m200
与所有的按钮,和每一个可能的其它组合; 即100
关,它看起来像: p=e50,m50,e200,m200
。
有什么想法吗? 我想最终对其他值( ss,sfs
等)做同样的事情,但是,让我们从移动平均线开始。
使用StringBuilder
和insert
方法。
字符串只是不可变的,因为在JVM中创建字符串后,无法更改字符串的特定实例的内容。 也就是说,这并不意味着您无法动态构建符合您需求的字符串。 您可以使用简单的连接并执行类似...
String options="z?s=GOOG&t=7m&z=l&q=l&p=" + eOption + ",m50&a=ss,sfs,vm,w14";
从技术上讲,这会创建三个String实例,并使用StringBuffer将它们全部附加在一起。 您可以自己使用StringBuffer API并在要添加选项的位置调用.append()。
使用可变字符串只会导致代码混乱。 您需要的是一种数据结构,可以轻松更新参数,然后遍历该数据结构以从中创建字符串。 我将这些参数存储在一个映射中,并编写一个函数,通过迭代映射条目从地图创建字符串。
因此,您将参数存储在地图中,如:
Map<String,String> map = new LinkedHashMap<>();
map.put("s", "GOOG");
map.put("t", "7m");
并使用以下内容生成参数字符串:
public String createParameterString(Map<String, String> map) {
StringBuilder builder = new StringBuilder("");
for (Map.Entry mapEntry : map.entrySet()) {
if (builder.length() != 0) builder.append("&");
builder.append(mapEntry.key());
builder.append("=")
builder.append(mapEntry.value());
}
return builder.toString();
}
通常,您将字符串分成几部分,然后组合一个新字符串。 然后,调用者可以保持对旧字符串和新字符串的引用,或者只是丢弃旧字符串。
作为一个愚蠢的例子:
String hairySally = "hairy,sally";
String hairyFredSally = insertFred(hairySally);
String insertFred( String s) {
String[] parts = s.split(",");
return parts[0] + ",fred," + parts[1];
}
您正在寻找的是格式化字符串 ,例如:
String querystringFormat="z?s=GOOG&t=7m&z=l&q=l&p=%s&a=ss,sfs,vm,w14"
请注意, e50,m50
已替换为%s
,格式字符串代码表示该部分字符串将替换为另一个字符串。
然后,您将执行任何操作来构建参数,并执行以下操作:
String params = "e50,m50,e100,m100,e200,m200",
Formatter formatter = new Formatter();
formatter.format(querystringFormat, params);
String query = formatter.toString();
使用格式字符串还有很多其他选项和细节,但这是基本的想法。 好的部分是字符串结构的不变部分是清晰的,您只需要替换需要替换的部分。
它还会教你如何使用C和C ++的printf
,这绝不是件坏事:)
你为什么要变异字符串? 为什么从String的角度来看待这个问题呢? 这个问题与文本无关。 这个序列的字符是什么
?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14
表示它只是一个映射(也称为字典),即一组键值对,根据URI编码方案序列化并附加到HTTP请求的URL。 您不希望跟踪序列化部分,特别是因为URI只接受一小部分字符,因此如果您根据字符串进行推理,您可能最终会得到非工作代码。
您需要两种方法:一种是将Map序列化为URI格式,另一种是从序列化形式中获取Map。 请注意,Yahoo协议使用逗号将多个值分配给同一个键。 在序列化和反序列化时,您也必须考虑到这一点。
我为你写了一个要点 。 它没有经过彻底的测试,但你明白了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.