我认为这是一个有趣的编程问题,所以我发布了它,即使我认为我有一个足够好的解决方案想法,请参阅 (*)。如果有人有一个优雅的解决方案,我很乐意看到它!
我正在使用一种调用外部库的方法,该库向服务器发出 http 请求。我需要有 K 个字符串作为输入才能有效,即外部资源的每次调用都是一个 HTTP 请求,我需要缓冲一些数据以提高效率。(例如,让 K 为 200,并在文本中以 1% 的概率作为标记出现,因此在找到 200 个输入参数之前,我需要处理 20,000 个标记)。
实际上,它的作用是:externalHTTP(commaDelimitedString) -> 获取有关每个字符串的信息。示例 externalHTTP("foo,bar") -> ["信息片段 1","信息片段 2"]。其中“信息片段 1”是关于“foo”的。
我想用信息片段替换长文本(字符串)中的“foo”和“bar”,但前提是我的 HTTP 请求缓冲区已满。在等待这种情况发生时,我仍然想继续阅读原始字符串。
文本通过拆分进行标记(因此我正在使用字符串数组)。
即我不想仅仅因为我正在等待 K 字符串缓冲而停止执行我的文本处理。
起初我认为我可以将单词存储为稍后更新的单个字符串对象,但后来我意识到字符串是不可变的,因此它是按值调用的。
(*) 我的第二个想法是存储单词(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;
}
}
}
}
更复杂的是,我想处理几个较长的文本,所以我需要一个字符串数组矩阵,每个文本一个。
我不喜欢类已知参考
String[] text
或者我在这段代码中处理索引的方式......
希望看到一些建议:)
编辑:改变了一点更清楚。我真的不能说我在查找什么,保密等,对不起。有些名称可能与 java 不同(只有一点点不同)。