Заменить «Пробелы в URL-адресе с помощью«% 20 »- вызов кодирования
Это была небольшая проблема с кодированием, предложенная в моей школе. Проблема заключается в следующем:
С учетом строки (или URL) замените белые пробелы внутри строки с
%20
, но любые пробелы снаружи не должны быть включены.Например, input
" Mr John Smith "
вернет"Mr%20John%20Smith"
Я успешно выполнил эту задачу, используя приведенный ниже код. Мой вопрос в том, есть ли способ повысить эффективность? Я считаю, что в настоящее время сложность \ $ O (2n) = O (n) \ $ задана для циклов 2. Я не хочу использовать какие-либо библиотеки или функции, такие как str.replace()
. Но я предполагаю, что есть лучший способ, чем обрезка, а затем подсчет пробелов.
public class URL {
/**
* @description URLify ~ A small method that makes a string with spaces URL Friendly!
* @param str
* @param length
* @return String
*/
public static String URLify(String str) {
str = str.trim();
int length = str.length();
int trueL = length;
if(str.contains(" ")) {
for(int i = 0; i < length; i++) {
if(str.charAt(i) == ' ') {
trueL = trueL + 2;
}
}
char[] oldArr = str.toCharArray();
char[] newArr = new char[trueL];
int x = 0;
for(int i = 0; i < length; i++) {
if(oldArr[i] == ' ') {
newArr[x] = '%';
newArr[x+1] = '2';
newArr[x+2] = '0';
x += 3;
} else {
newArr[x] = oldArr[i];
x++;
}
}
str = new String(newArr, 0, trueL);
}
return str;
}
public static void main(String[] args) {
String str = " https://google.com/ testing .pdf ";
str = URLify(str);
System.out.print(str);
}
}
Примечание: Я ищу любую критику. Я действительно хотел бы улучшить свои навыки в целом.
3 ответа
Из краткого обзора:
- Если вы собираетесь написать свой собственный
replace
, тогда вы должны создать для него метод, чтобы вы могли вызватьmyReplace( string, target, replacement);
- Лично я бы проверил, получил ли
args
строку String, и только если ничего не предусмотрено, я бы использовал строчную кодированную строку, которая упростит отображение и тестирование вашего дизайна. -
Нет причин для этого в двух строках:
str = URLify(str); System.out.print(str);
вы можете просто написать
System.out.print(URLify(str));
- Комментирование Javadoc выглядит хорошо (но на самом деле это не так?), иначе есть нулевые комментарии
- Я уверен, что вы можете объединить эти 2 цикла в один, если вы использовали StringBuilder . В целом алгоритм замены может использовать работу
Следующее простейшее решение, не считая str.replace(...)
, должно было бы использовать StringBuilder
: для каждого пространства добавьте %20
, иначе добавьте сам символ.
Но я думаю, вы не хотели этого делать.
Вы проявили особую осторожность, чтобы избежать ненужной обработки (путем проверки, содержит ли строка пробел) и ненужных распределений (с учетом точного размера хранилища). Но тогда обрезка рода поражает цель остальной части кода: в случае, если что-то обрезается, который будет включать выделение новой строки, и полная итерация по источнику. Чтобы соответствовать остальной части кода, вы могли бы сделать обрезку самостоятельно.
Возможны некоторые незначительные технические улучшения:
-
Поскольку вы используете только
length
иtrueL
, когда вы знаете, что строка содержит пробел, было бы лучше объявить эти переменные в области блокаif
-
Вместо длинного фрагмента кода внутри
if (str.contains(" ")) {
, вы можете отменить условие для раннего возврата и сделать код льстит, что немного легче читать -
Вместо цикла подсчета, если каждый из циклов для каждого из них является более идиоматическим. Вы можете создать
oldArr
перед циклом подсчета и использовать его в цикле, который подсчитывает пробелы -
Вместо вычисления странно названного
trueL
, вы можете подсчитать количество пробелов и сохранить его в естественном названииspaces
-
Так как
newArr
имеет точный размер для строки результата, вы можете использовать однопараметрический конструкторString
-
Вы можете объявить
x
в инициализаторе второгоfor
, чтобы ограничить область действия телом цикла
Что-то вроде этого:
public static String urlencode(String str) {
str = str.trim();
if (!str.contains(" ")) {
return str;
}
char[] chars = str.toCharArray();
int spaces = 0;
for (char c : chars) {
if (c == ' ') {
spaces++;
}
}
char[] newArr = new char[chars.length + 2 * spaces];
for (int i = 0, x = 0; i < chars.length; i++) {
char c = chars[i];
if (c == ' ') {
newArr[x] = '%';
newArr[x + 1] = '2';
newArr[x + 2] = '0';
x += 3;
} else {
newArr[x] = c;
x++;
}
}
return new String(newArr);
}
Большая часть Javadoc избыточна и может быть удалена. Осталось: «Делает строку с пробелами, удобными для URL».
Имена переменных должны следовать шаблону. То есть все переменные для входной строки должны иметь in
в имени, а все выходные переменные должны иметь out
. Или, по крайней мере, i
и o
.
Вы должны были сказать нам why , что вы не хотите использовать существующие библиотеки, потому что при использовании библиотек проблема становится тривиальной: return in.trim().replace(" ", "%20")
.
Кстати, хорошо, что ваш код не нуждается в комментариях. Это означает, что он все еще достаточно прост, чтобы понять его, читая только.