Заменить «Пробелы в 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);
    }
}

Примечание: Я ищу любую критику. Я действительно хотел бы улучшить свои навыки в целом.

11 голосов | спросил Tommy Yamakaitis 1 Maypm17 2017, 20:32:51

3 ответа


8

Из краткого обзора:

  • Если вы собираетесь написать свой собственный replace, тогда вы должны создать для него метод, чтобы вы могли вызвать myReplace( string, target, replacement);
  • Лично я бы проверил, получил ли args строку String, и только если ничего не предусмотрено, я бы использовал строчную кодированную строку, которая упростит отображение и тестирование вашего дизайна.
  • Нет причин для этого в двух строках:

    str = URLify(str);
    System.out.print(str);
    

    вы можете просто написать

    System.out.print(URLify(str));
    
  • Комментирование Javadoc выглядит хорошо (но на самом деле это не так?), иначе есть нулевые комментарии
  • Я уверен, что вы можете объединить эти 2 цикла в один, если вы использовали StringBuilder . В целом алгоритм замены может использовать работу
ответил konijn 1 Maypm17 2017, 21:04:53
6

Следующее простейшее решение, не считая 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);
}
ответил janos 1 Maypm17 2017, 21:36:34
5

Большая часть Javadoc избыточна и может быть удалена. Осталось: «Делает строку с пробелами, удобными для URL».

Имена переменных должны следовать шаблону. То есть все переменные для входной строки должны иметь in в имени, а все выходные переменные должны иметь out. Или, по крайней мере, i и o.

Вы должны были сказать нам why , что вы не хотите использовать существующие библиотеки, потому что при использовании библиотек проблема становится тривиальной: return in.trim().replace(" ", "%20").

Кстати, хорошо, что ваш код не нуждается в комментариях. Это означает, что он все еще достаточно прост, чтобы понять его, читая только.

ответил Roland Illig 1 Maypm17 2017, 21:39:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132