3

私はちょっとした学生の趣味プロジェクトとして API を開発しています。さまざまなオプションを追加/削除して受信した情報を変更できる URL を使用しています。私は文字列が不変であることを知っています。私はそれを解決するためにいくつかの面倒な方法を考え出しましたが、それほど堅牢なものはありません。標準的なアプローチがあるかどうか疑問に思っています。オプションを「含める」、「追加する」、「除外する」ことができるラジオ ボタン (グループのボタンに割り当てられていない、すべての順列が必要) を用意する予定です。

したがって、z?s=GOOG&t=7m&z=l&q=l&p=e50,m50&a=ss,sfs,vm,w14YahooFinance API との対話に使用される文字列は次のとおりです。したがって、次のような変数があるとします。

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

ここで、 と書かれている部分を考えてみましょうp=e50,m50。すべてのボタンがオンになっている文字列と、他の可能なすべての組み合わせを使用できるように、オン/オフをオンにしたい3 つのラジオボタン50、があるとします。つまり、off の場合は次のようになります。100200p=e50,m50,e100,m100,e200,m200100p=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";

技術的には、これにより 3 つの 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

変更可能な文字列を使用すると、コードが乱雑になるだけです。必要なのは、パラメーターを簡単に更新し、そのデータ構造を走査してそこから文字列を作成できるデータ構造です。これらのパラメーターをマップに格納し、マップ エントリを反復処理してマップから文字列を作成する関数を記述します。

したがって、次のようにパラメーターをマップに保存します。

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 を取得するメソッドの 2 つのメソッドが必要です。Yahoo プロトコルでは、カンマを使用して複数の値を同じキーに割り当てることに注意してください。シリアル化および逆シリアル化するときも、これを考慮する必要があります。

私はあなたのために要点を書きました。完全にテストされているわけではありませんが、アイデアはわかります。

于 2013-03-29T20:53:30.503 に答える
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 に答える