我正在开发一个API作为一个学生的爱好项目,我正在使用一个网址,可以添加/减少不同的选项来更改收到的信息。我知道字符串是不可变的,这使得整齐地解决问题变得有些困难。我想出了一些混乱的方法,没有一个是强大的,解决它,我想知道是否有标准的方法。我计划让单选按钮(未分配给一个按钮组;想要所有排列),这将允许我“包含”,“添加”和“排除”选项。
因此,这里是用于与YahooFinance API交互的字符串z?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,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
等)做同样的事情,但是,让我们从移动平均线开始。
答案 0 :(得分:8)
使用StringBuilder
和insert
方法。
答案 1 :(得分:6)
字符串只是不可变的,因为在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()。
答案 2 :(得分:2)
使用可变字符串只会导致代码混乱。您需要的是一种数据结构,可以轻松更新参数,然后遍历该数据结构以从中创建字符串。我将这些参数存储在一个映射中,并编写一个函数,通过迭代映射条目从地图创建字符串。
因此,您将参数存储在地图中,如:
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();
}
答案 3 :(得分:2)
通常,您将字符串分成几部分,并组装一个新字符串。然后,调用者可以保持对旧字符串和新字符串的引用,或者只是丢弃旧字符串。
作为一个愚蠢的例子:
String hairySally = "hairy,sally";
String hairyFredSally = insertFred(hairySally);
String insertFred( String s) {
String[] parts = s.split(",");
return parts[0] + ",fred," + parts[1];
}
答案 4 :(得分:1)
您要找的是formatted strings,例如:
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
,这绝不是坏事:)。
答案 5 :(得分:1)
为什么要变异字符串?为什么从String的角度来看待这个问题呢?这个问题与文本无关。这个字符序列是什么
?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14
表示它只是一个映射(也称为字典),即一组键值对,根据URI encoding scheme序列化并附加到HTTP请求的URL。您不希望跟踪序列化部分,特别是因为URI只接受一小部分字符,因此如果您根据字符串进行推理,则可能最终会得到非工作代码。
您需要两种方法:一种是将Map序列化为URI格式,另一种是从序列化形式中获取Map。请注意,Yahoo协议使用逗号将多个值分配给同一个键。在序列化和反序列化时,您也必须考虑到这一点。
我为你写了a gist。它没有经过彻底的测试,但你明白了。