tl; dr
Ваш метод searchStudent
вводит в заблуждение (a) номер индекса, возвращаемый String::indexOf
, с (b) необходим для отслеживания найденных совпадений.
Я предлагаю вам написать алгоритм метода поиска в простой прозе, а затем сравнить с вашим кодом.
Индекс 0 означает совпадение в начале строки
Метод String::indexOf
возвращает индекс (номер позиции, начинающийся с нуля), указывающий первую позицию, в которой была найдена желаемая целевая строка. Подробнее о подсчете индексов см. В Википедии: Нумерация на основе нуля .
При вызове String::indexOf
, результирующий индекс равен нулю. (0
) означает, что ваша цель будет найдена в начале рассматриваемой строки. Например, вы делаете эквивалент поиска Bob
в имени Bobby
(или в Bob
в этом отношении).
String name = "Bobby" ;
String target = "Bob" ;
int index_Bob = name.indexOf( target ) ;
System.out.println( "index_Bob: " + index_Bob ) ;
index_Bob: 0
При вызове String::indexOf
результирующий отрицательный индекс (-1
) означает вашу цель не найден, не содержится в строке.
String name = "Bobby" ;
String target = "Xyz" ;
int index_Xyz = name.indexOf( target ) ;
System.out.println( "index_Xyz: " + index_Xyz ) ;
index_Xyz: -1
Найдите by
в Bobby
, и мы получим результат 3 (указатель на 4-ю букву).
int index_by = name.indexOf( "by" ) ;
System.out.println( "index_by: " + index_by ) ;
index_by: 3
Посмотрите этот код, запущенный на IdeOne.com .
Количество
Если вы пытаетесь подсчитать количество успешных тестов «содержит», и вам на самом деле все равно, , где соответствует цели, только то, что она соответствует , тогда нет необходимости вызывать indexOf
.
Измените это:
count = z.getName().indexOf(target);
… на это:
count = ( count + 1 ) ; // Increment the count of matches.
Stream
Кстати, продвинутый способ получить счетчик - это использовать поток (см. Tutorial ). См. Мой пример кода ниже.
У меня нет вашего Student
класса, поэтому я просто использую String
здесь. Вы должны изменить его ( Student student ) -> student.getName().contains( "Bob" )
для своего кода.
List< String > names = List.of(
"Alice", "Bobby", "Bobette" , "Carol"
);
long countBobs =
names
.stream()
.filter(
( String name ) -> name.contains( "Bob" )
)
.count()
;
См. Этот код, запущенный в режиме реального времени на IdeOne.com .
countBobs: 2