これは興味深いプログラミングの問題だと思ったので、十分に優れた解決策のアイデアがあると思いますが、投稿しました (*) を参照してください。誰かがエレガントなソリューションを持っているなら、私はそれを見たいです!
サーバーへの http 要求を行う外部ライブラリを呼び出すメソッドを使用しています。有効にするには、入力として K 個の文字列が必要です。つまり、外部リソースの各呼び出しは HTTP リクエストであり、有効にするために一部のデータをバッファリングする必要があります。(例として、K を 200 とし、1% の確率でテキスト内のトークンとして発生するため、200 個の入力引数を見つける前に 20,000 個のトークンを処理する必要があります)。
これが実際に行うことは次のとおりです: externalHTTP(commaDelimitedString) -> 各文字列に関する情報を取得します。例 externalHTTP("foo,bar") -> ["情報スニペット 1","情報スニペット 2"]. 「情報スニペット 1」は「foo」に関するものです。
長いテキスト (文字列) の "foo" と "bar" を情報スニペットに置き換えたいのですが、HTTP 要求のバッファがいっぱいになった後でのみです。これが起こるのを待っている間、私はまだ元の文字列を読み続けたい.
テキストは分割によってトークン化されます (そのため、文字列の配列を操作しています)。
つまり、K 個の文字列がバッファリングされるのを待っているという理由だけで、テキスト処理の実行を停止したくありません。
最初は、後で更新する個々の文字列オブジェクトとして単語を保存できると思っていましたが、文字列は不変であるため、値によって呼び出されることに気付きました。
(*) 私の 2 番目のアイデアは、単語 (foo と bar) のインデックスを格納し、http 要求が終了したときにスニペットを元の文字列配列に挿入することでした。お気に入り
class doStuff {
String text[];
LinkedList<Integer> idxList = new LinkedList<Integer>();
public doStuff(String[] t) {
text = t;
int i = 0;
for (String token : text) {
if (shouldReplaceToken(token)) {
replaceToken(i);
}
i++;
//do other work with the tokens
}
}
void replaceToken(int i) {
idxList.add(i);
if (++count > buffSize) {
count = 0;
String commaDelim = "";
ListIterator<Integer> it = idxList.getListIterator(0);
while (it.hasNext()) {
commaDelim += text[it.next()]+",";
}
String[] http_response = http_req(commaDelim);
for (String snippet : http_response) {
idx = idxList.poll(); //this is not elegant, dependent on FIFO order
text[Idx] = snippet;
}
}
}
}
さらに複雑なのは、いくつかの長いテキストを処理したいので、テキストごとに 1 つの文字列配列のマトリックスが必要になることです。
クラス既知の参照が好きではない
String[] text
または、このコードでインデックスを処理する方法...
いくつかの提案を期待しています:)
編集:より明確にするために少し変更しました。私が調べていること、非開示などを本当に言うことはできません。申し訳ありません。一部の名前は Java とは異なる場合があります (ほんのわずかな違いです)。