#java #substring
#java #подстрока
Вопрос:
У меня есть отдельный тестовый класс, который собирается передавать строку с высоким значением и низким значением с : между ними, представляющими числа 0-6. Примером может служить «6: 2». Мне нужно разделить эти числа на основе разделителя:, но мой профессор не хочет, чтобы я использовал разделение или любое другое регулярное выражение.
public class DominoHighLowImpl_Laursen implements Domino {
public static final String HIGH_LOW_STRING_SEPARATOR = ":";
public DominoHighLowImpl(String highLowString)
{
}
Итак, набрав
String substr = highLowString.substring(highLowString.indexOf(HIGH_LOW_STRING_SEPARATOR) 1);
вернула число после разделителя, как я и ожидал
НО
String substr = highLowString.substring(highLowString.indexOf(HIGH_LOW_STRING_SEPARATOR) - 1);
не возвращает число перед разделителем. Что я делаю не так в последней части?
Комментарии:
1. Взгляните на
substring(int)
иsubstring(int, int)
Ответ №1:
Проверьте подстрока (int beginIndex) и подстрока (int beginIndex, int endIndex):
String high = highLowString.substring(0, highLowString.indexOf(HIGH_LOW_STRING_SEPARATOR));
String low = highLowString.substring(highLowString.indexOf(HIGH_LOW_STRING_SEPARATOR) 1);
Ответ №2:
String substr = highLowString.substring(highLowString.indexOf(HIGH_LOW_STRING_SEPARATOR) 1);
работает, потому что indexOf(HIGH_LOW_STRING_SEPARATOR)
равно 1. Таким образом, substring(2)
будет содержать «2».
Но когда вы делаете
String substr = highLowString.substring(highLowString.indexOf(HIGH_LOW_STRING_SEPARATOR) - 1)
значение становится indexOf(0)
таким образом, сохраняется целая строка «6:2».
Попробуйте
String substr = highLowString.substring(0,highLowString.indexOf(HIGH_LOW_STRING_SEPARATOR));
чтобы получить «6».
Ответ №3:
substring
Метод перегружен, что означает, что он может вызываться, передавая разное количество int
параметров / аргументов. Если вы вызовете его только с одним, вы получите подстроку, которая начинается с переданного индекса и заканчивается на максимальном индексе String
. Если вы вызовете его с двумя параметрами, вы получите подстроку, которая начинается с нижнего переданного индекса и заканчивается перед вторым переданным индексом.
Смотрите этот пример:
public class DominoHighLowImpl_Laursen {
public static final String HIGH_LOW_STRING_SEPARATOR = ":";
private String highLowString;
public DominoHighLowImpl_Laursen(String highLowString) {
this.highLowString = highLowString;
}
public String getLow() {
return highLowString.substring(0, highLowString.indexOf(HIGH_LOW_STRING_SEPARATOR));
}
public String getHigh() {
return highLowString.substring(highLowString.indexOf(HIGH_LOW_STRING_SEPARATOR) 1);
}
public static void main(String[] args) {
DominoHighLowImpl_Laursen domino = new DominoHighLowImpl_Laursen("1020304:4456778");
System.out.println("High:t" domino.getHigh());
System.out.println("Low:t" domino.getLow());
}
}
Комментарии:
1. Было бы более эффективно, если бы вы выполняли эти вызовы substring непосредственно внутри конструктора, но это всего лишь деталь
2. @Lino совершенно прав, но здесь это не было бы наглядным примером. У одного должно быть два
String
атрибута и затем определяться с помощью конструктора. Я думаю, что OP не желает оптимальной эффективности в этом случае.