Java:尽管字符串不变,但如何“改变”字符串?

时间:2013-03-29 20:33:55

标签: java string

我正在开发一个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部分。假设我有三个50100200我想打开/关闭的单选按钮,以便我有一个字符串p=e50,m50,e100,m100,e200,m200,所有按钮都打开,并且每种可能的其他组合;即100关闭,它看起来像:p=e50,m50,e200,m200

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

6 个答案:

答案 0 :(得分:8)

使用StringBuilderinsert方法。

Java documentation page

答案 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。它没有经过彻底的测试,但你明白了。