Как работает substring ()? - PullRequest
7 голосов
/ 19 мая 2009

Я не понимаю, почему метод Java [String.substring ()] (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#substring(int,%20int%29) указан так, как он есть. Я не могу сказать, чтобы он начинался с нумерованной позиции и возвращал указанное число символы; я должен сам вычислить конечную позицию. И если я указываю конечную позицию после конца строки, вместо того, чтобы просто возвращать для меня оставшуюся часть строки, Java выдает исключение.

Я привык к языкам, где substring () (или substr ()) принимает два параметра: начальную позицию и длину. Это объективно лучше, чем то, как это делает Java, и если да, то можете ли вы доказать это? Какую лучшую спецификацию языка для substring () вы когда-либо видели, и когда, если вообще когда-либо, будет хорошей идеей для языка сделать что-то по-другому? Является ли это IndexOutOfBoundsException, что Java дает хорошую идею дизайна, или нет? Все это сводится к личным предпочтениям?

Ответы [ 6 ]

9 голосов
/ 19 мая 2009

Бывают моменты, когда второй параметр, являющийся длиной, более удобен, и бывают случаи, когда вторым параметром, являющимся «смещением до остановки», более удобно. Точно так же бывают случаи, когда «если я дам вам что-то слишком большое, просто зайдите в конец строки», это удобно, и бывают случаи, когда это указывает на ошибку и действительно должно вызвать исключение.

Второй параметр, представляющий длину, полезен, если у вас фиксированная длина поля. Например:

// C#
String guid = fullString.Substring(offset, 36);

Второй параметр, являющийся смещением, полезен, если вы переходите к другому разделителю:

// Java
int nextColon = fullString.indexOf(':', start);
if (start == -1)
{
    // Handle error
}
else
{
    String value = fullString.substring(start, nextColon);
}

Как правило, тот, который вы хотите использовать, противоположен тому, который предоставляется на вашей текущей платформе, по моему опыту:)

5 голосов
/ 19 мая 2009

Я привык к языкам, где substring () (или substr ()) занимает два параметры: начальная позиция и длина. Это объективно лучше чем то, как это делает Java, и если да, ты можешь это доказать?

Нет, объективно лучше. Все зависит от контекста, в котором вы хотите его использовать. Если вы хотите извлечь подстроку определенной длины, это плохо, но если вы хотите извлечь подстроку, которая заканчивается, скажем, при первом появлении «.» в строке это лучше, чем если бы вы сначала вычислили длину. Вопрос в том, какое требование чаще встречается? Я бы сказал последнее. Конечно, лучшим решением было бы иметь обе версии в API, но если вам все время нужна основанная на длине версия, использование статического служебного метода не так уж ужасно.

Что касается исключения, да, это определенно хороший дизайн. Вы просили что-то конкретное, и когда вы не можете получить эту конкретную вещь, API не должен пытаться угадать, что вы, возможно, вместо этого хотели - таким образом, ошибки становятся очевидными быстрее.

Кроме того, в Java DOES есть альтернативный метод substring () , который возвращает подстроку из начального индекса до конца строки.

3 голосов
/ 19 мая 2009

второй параметр должен быть необязательным, первый параметр должен принимать отрицательные значения ..

1 голос
/ 19 мая 2009

Получив некоторую обратную связь, я вижу, когда сценарий второго параметра как индекса полезен, но до сих пор все эти сценарии, кажется, работают вокруг ограничений других языков / API. Например, API не предоставляет удобную процедуру для выдачи мне строк до и после первого двоеточия во входной строке, поэтому вместо этого я получаю индекс этой строки и вызываю substring (). (И это объясняет, почему второй параметр позиции в substr () отклоняет желаемый индекс на 1, IMO.)

Мне кажется, что с более полным набором функций обработки строк в инструментарии языка сценарий второго параметра как индекса проигрывает второму параметру как длине. Но кто-нибудь, пожалуйста, отправьте мне контрпример. :)

1 голос
/ 19 мая 2009

Если вы пропустите второй параметр , он перейдет к концу строки без необходимости его вычисления.

0 голосов
/ 19 мая 2009

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

public String skipsSubstring(String s, int index, int length) {
    return s.subString(index, index+length);
}
...