Каков наилучший способ удалить дублирующиеся параметры URI из строки? - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть строка, root?param1=...&param2=...&param3=..., и я хочу создать Java-метод, который удалит все дублирующиеся параметры. Значения всегда будут одинаковыми, но иногда параметры дублируются в соответствии с функцией приложения (не спрашивайте). Для этого,

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

становится

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

Я слишком долго не программировал, чтобы вспомнить лучшие способы сделать это, но мой первоначальный ход мыслей прошел примерно так:

Захватите каждый параметр и вставьте во временный массив, пропустите временный массив и сравните, совпадает ли массив [i] с любым другим именем параметра. Если так, удалите. Если нет, добавьте обратно к возвращаемой строке. В конце цикла выведите возвращаемую строку.

Но для этого потребуется O (n) для длины URI плюс O (m)! для размера массива (m является числом параметров). Я думаю, это было бы очень плохо, учитывая, что я буду запускать этот метод со скоростью 5000x в минуту для всех входящих URI. Есть ли лучший способ сделать это или использовать готовый Java-метод, который обрабатывает некоторые накладные расходы?

Ответы [ 4 ]

1 голос
/ 20 февраля 2012

Вы можете вставить пары ключ / значение в Map<String,String>. Это автоматически позаботится о дублированных ключах и будет очень легко закодировать.

Чтобы убедиться, что параметры с одинаковыми ключами имеют одинаковые значения, вы можете проверить возвращаемое значение put(): оно должно быть либо null, либо равным только что введенному вами значению.

0 голосов
/ 30 сентября 2018

Вот мое решение с лямбда-выражением в Java.

// 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));
0 голосов
/ 21 февраля 2012

Ради любви к Богу, не пиши для этого своего собственного грубого парсера.

Найдите библиотеку HTTP, которая обрабатывает анализ параметров, и используйте ее.

Это может помочь: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URLEncodedUtils.html

0 голосов
/ 20 февраля 2012

Если вы настаиваете на этом (не?), То вы можете использовать Map.

Для каждой из ваших пар параметр-значение вставьте их вmap.

У вас останутся только уникальные параметры, которые вы затем сможете использовать для перестройки вашего URI.

Вы бы итерировали свои пары параметр-значение один раз, а затем итерировали бы вашу картуодин раз, чтобы восстановить URI.

Или, как сказал Тило, вы не можете сделать это и позволить получателю разобраться с дубликатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...