我有一个字符串root?param1=...¶m2=...¶m3=...
,我想创建一个可以删除任何重复参数的java方法。值总是相同的,但有时候params根据应用程序的功能重复(不要问)。为此,
HTTP://root?param1=value¶m2=value2¶m2=value2param3=value3¶m3=value3¶m1=value¶m1=value
变为
HTTP://root?param1=value¶m2=value2¶m3=value3
我的编程时间太长,无法记住最好的方法,但我最初的思路是这样的:
抓住每个参数并插入临时数组,运行临时数组并比较array [i]是否等于任何其他参数名称。如果是,请删除。如果没有,请添加回返回字符串。在循环结束时,打印返回字符串。
但是这需要O(n)表示URI的长度加上O(m)!对于数组的大小(m是参数的数量)。我认为,考虑到我将以每分钟5,000x的速度运行此方法来处理所有传入的URI,这将是非常糟糕的。有没有更好的方法来处理这个或开箱即用的java方法来处理一些开销?
答案 0 :(得分:1)
您可以将键/值对粘贴到Map<String,String>
中。这将自动处理重复的密钥,并且非常容易编码。
要验证具有相同键的参数是否具有相同的值,您可以检查put()
的返回值:它应该是null
,或者等于您刚刚插入的值。
答案 1 :(得分:0)
如果你坚持这样做(不是吗?),那么你可以使用Map
。
对于每个参数 - 值对,将它们插入到地图中。
您将只剩下唯一的参数,然后您可以使用它们来重建您的URI。
您将迭代您的参数 - 值对,然后迭代您的Map一次以重建URI。
或者,就像Thilo说的那样,你不能这样做,让接收者处理重复的事情。
答案 2 :(得分:0)
为了爱上帝,不要为此写自己的狡猾的解析器。
找到一个处理参数解析的HTTP库并使用它。
答案 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));