Java-подстрока в разделителе, не использующая разделение или регулярное выражение

#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 не желает оптимальной эффективности в этом случае.