簡體   English   中英

Java:盡管字符串不變,但如何“改變”字符串?

[英]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 假設我有三個單選按鈕50100200 ,我想剔開/關,使得我有一個字符串p=e50,m50,e100,m100,e200,m200與所有的按鈕,和每一個可能的其它組合; 100關,它看起來像: p=e50,m50,e200,m200

有什么想法嗎? 我想最終對其他值( ss,sfs等)做同樣的事情,但是,讓我們從移動平均線開始。

使用StringBuilderinsert方法。

Java文檔頁面

字符串只是不可變的,因為在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM