3

我正在开发一个 API 作为学生爱好项目的一部分,并且我正在使用一个 url,可以在其中添加/减去不同的选项来更改接收到的信息。我知道字符串是不可变的,这使得巧妙地处理事情变得有些挑战。我想出了一些杂乱无章的方法来解决它,但我想知道是否有标准方法。我计划有单选按钮(未分配给按钮组;想要所有排列),这将允许我“包含”、“添加”和“排除”选项。

因此,这里是z?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14用于与 YahooFinance API 交互的字符串。所以,假设我有一些像这样的变量:

 String options="z?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14"

现在,考虑说的部分p=e50,m50。假设我有三个单选按钮50, 100200我想勾选/关闭,这样我就有一个p=e50,m50,e100,m100,e200,m200所有按钮都打开的字符串,以及所有可能的其他组合;即100关闭,它看起来像:p=e50,m50,e200,m200

有什么想法吗?我也想最终对其他值(ss,sfs等)做同样的事情,但是,让我们从移动平均线开始。

4

6 回答 6

9

使用 aStringBuilderinsert方法。

Java 文档页面

于 2013-03-29T20:37:59.860 回答
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() 。

于 2013-03-29T20:38:59.027 回答
2

通常,您将字符串分成几部分,然后组装一个新字符串。然后,调用者可以保持对旧字符串和新字符串的引用,或者简单地丢弃旧字符串。

举个愚蠢的例子:

String hairySally = "hairy,sally";
String hairyFredSally = insertFred(hairySally);


String insertFred( String s) {
    String[] parts = s.split(",");
    return parts[0] + ",fred," + parts[1];
}
于 2013-03-29T20:38:18.767 回答
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,这绝不是一件坏事 :)

于 2013-03-29T20:44:48.680 回答
1

使用可变字符串只会导致代码混乱。您需要的是一种数据结构,可以轻松更新参数,然后遍历该数据结构以从中创建字符串。我会将这些参数存储在地图中并编写一个函数,该函数将通过遍历地图条目从地图中创建字符串。

因此,您可以将参数存储在地图中,例如:

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();
}
于 2013-03-29T20:36:54.137 回答
1

为什么要改变字符串?你为什么要从字符串的角度来解决这个问题?这个问题与文本无关。这个字符序列是什么

?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14

表示它只是一个映射(也称为字典),即键值对的集合,根据URI 编码方案序列化并附加到 HTTP 请求的 URL。您不想跟踪序列化的部分,特别是因为 URI 只接受一小部分字符,所以如果您根据字符串进行推理,您最终可能会得到无效的代码。

您需要两种方法:一种将 Map 序列化为 URI 格式,另一种将 Map 从其序列化形式中取回。请注意,Yahoo 协议使用逗号将多个值分配给同一个键。在序列化和反序列化时,您也必须考虑到这一点。

我为你写了一个要点。它没有经过彻底的测试,但你明白了。

于 2013-03-29T20:53:30.503 回答