У меня есть отдельный тестовый класс, который будет передавать строку с высоким значением и низким значением с : между ними, представляющими числа 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);
не возвращает число перед разделителем. Что я делаю не так в последней части?




Проверьте подстрока (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);
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".
Метод 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());
}
}
Было бы более эффективно, если бы вы выполняли эти вызовы подстроки непосредственно внутри конструктора, но это всего лишь деталь.
@ Лино совершенно прав, но здесь это не наглядный пример. Нужно иметь два атрибута String и определить их через конструктор. Я думаю, что OP не желает оптимальной эффективности в этом случае.
Взгляните на
substring(int)иsubstring(int, int)