что не так в моем поиске в объекте ArrayList по строке? - PullRequest
0 голосов
/ 03 февраля 2020
  • Что не так с методом searchStudent, который каждый раз возвращает 0? int searchStudent (String target) Находит и дает нужный индекс по имени.

    import java .util.ArrayList;

class Student {

String name;
double gpa;

public Student(String name, double gpa) {
    this.name = name;
    this.gpa = gpa;
}

public String getName() {
    return name;
}

}

publi c class StackOverflow {

static ArrayList<Student> stu = new ArrayList<>();

public static void main(String[] args) {
    stu.add(new Student("Hadi", 2.3));  // <-- every time shows 'Hadi'
    stu.add(new Student("Jack", 1.8));
    stu.add(new Student("Sara", 4.6));

    System.out.println("----- Searching For A Student -----");
    int recurse = searchStudent("Jack");
    if (recurse == -1) {
        System.out.println("There is no Student with this name !!");
    } else {                       //if 'Jack' was in List show his name
        System.out.println(getStudent(recurse).getName());
    }
}

public static int searchStudent(String target) {
    int indexTarget = -1;
    for (Student z : stu) {
        if (z.getName() != null && z.getName().contains(target)) {
            indexTarget = z.getName().indexOf(target);
        }
    }
    return indexTarget;
}

public static Student getStudent(int index) {
    return stu.get(index);
}

}

1 Ответ

0 голосов
/ 03 февраля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...