【发布时间】:2012-09-04 06:33:15
【问题描述】:
我认为这是一个有趣的编程问题,所以我发布了它,尽管我认为我有一个足够好的解决方案,请参阅 (*)。如果有人有一个优雅的解决方案,我很乐意看到它!
我正在使用一种调用外部库的方法,该库向服务器发出 http 请求。我需要有 K 个字符串作为输入才能有效,即外部资源的每次调用都是一个 HTTP 请求,我需要缓冲一些数据以提高有效性。 (例如,假设 K 为 200,并在文本中以 1% 的概率作为标记出现,因此在找到 200 个输入参数之前,我需要处理 20,000 个标记)。
实际上它的作用是:externalHTTP(commaDelimitedString) -> 获取每个字符串的信息。示例 externalHTTP("foo,bar") -> ["information sn-p 1","information sn-p 2"]。其中“信息 sn-p 1”是关于“foo”的。
我想用信息 sn-ps 替换长文本(字符串)中的“foo”和“bar”,但前提是我的 HTTP 请求缓冲区已满。在等待这种情况发生时,我仍然想继续阅读原始字符串。
文本是通过拆分来标记的(所以我正在处理一个字符串数组)。
即我不想仅仅因为我正在等待 K 个字符串缓冲就停止执行我的文本处理。
起初我以为我可以将单词存储为单独的字符串对象,然后我会更新,但后来我意识到字符串是不可变的,所以它是按值调用的。
(*) 我的第二个想法是存储单词(foo 和 bar)的索引,然后在 http 请求完成时将 sn-ps 插入到原始字符串数组中。喜欢
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 不同(只有一点点不同)。
【问题讨论】:
-
您对问题的描述很难理解。请尝试编辑问题,以便外人更容易理解。假设我们一无所知,并且对您想要做的事情进行清晰和描述。一个具体的例子会很有帮助。
-
连第一句话都无法理解:我正在使用一种调用外部资源的方法,该方法需要有 K 个字符串作为输入才能生效,即每次调用外部资源都是一个HTTP 请求,我需要缓冲一些数据才能生效。
K strings是什么意思?短语buffer up some data for effectiveness几乎无法解释您要实现的目标。 -
它基本上是关于注册具有特定子字符串的侦听器,这些子字符串在 http 请求发生时被调用。与异步事件比较。
-
好的,让我看看我是否关注... 你会得到一大串字符串作为输入。您想遍历该数组并使用一种方法来检查字符串是否应该被替换。如果是这样,则将其索引添加到列表的末尾。一旦列表达到某个阈值,就会调用一个网页,该网页返回一个字符串数组,该数组应用于替换原始字符串。听起来对吗?
-
刚刚编辑了我的答案,试图展示如何异步执行此操作...换句话说,如何做到这一点,这样你就不会停止必须在等待时停止处理单词列表用于 HTTP 请求。
标签: java multithreading string