从字符串中删除重复URI参数的最佳方法是什么?

时间:2012-02-20 08:17:51

标签: java performance

我有一个字符串root?param1=...&param2=...&param3=...,我想创建一个可以删除任何重复参数的java方法。值总是相同的,但有时候params根据应用程序的功能重复(不要问)。为此,

HTTP://root?param1=value&param2=value2&param2=value2param3=value3&param3=value3&param1=value&param1=value

变为

HTTP://root?param1=value&param2=value2&param3=value3

我的编程时间太长,无法记住最好的方法,但我最初的思路是这样的:

抓住每个参数并插入临时数组,运行临时数组并比较array [i]是否等于任何其他参数名称。如果是,请删除。如果没有,请添加回返回字符串。在循环结束时,打印返回字符串。

但是这需要O(n)表示URI的长度加上O(m)!对于数组的大小(m是参数的数量)。我认为,考虑到我将以每分钟5,000x的速度运行此方法来处理所有传入的URI,这将是非常糟糕的。有没有更好的方法来处理这个或开箱即用的java方法来处理一些开销?

4 个答案:

答案 0 :(得分:1)

您可以将键/值对粘贴到Map<String,String>中。这将自动处理重复的密钥,并且非常容易编码。

要验证具有相同键的参数是否具有相同的值,您可以检查put()的返回值:它应该是null,或者等于您刚刚插入的值。

答案 1 :(得分:0)

如果你坚持这样做(不是吗?),那么你可以使用Map

对于每个参数 - 值对,将它们插入到地图中。

您将只剩下唯一的参数,然后您可以使用它们来重建您的URI。

您将迭代您的参数 - 值对,然后迭代您的Map一次以重建URI。

或者,就像Thilo说的那样,你不能这样做,让接收者处理重复的事情。

答案 2 :(得分:0)

为了爱上帝,不要为此写自己的狡猾的解析器。

找到一个处理参数解析的HTTP库并使用它。

这可能会起到作用:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URLEncodedUtils.html

答案 3 :(得分:0)

这是我在Java中使用lambda表达式的解决方案。

// input: query string
// output: parameter map(Map<String, String>) in least recently updated order 
List<String> pairs = Splitter.on("&").splitToList(queryStr);

return pairs.stream().map(s -> s.split("=", 2)).collect(Collectors.toMap(pair -> pair[0],
                pair -> (pair.length > 1 ? pair[1] : ""), (formerValue, latterValue) -> latterValue, LinkedHashMap::new));