我通过字符串在对象ArrayList中进行搜索有什么问题?

问题描述 投票:-2回答:1
  • 每次返回0的searchStudent方法有什么问题?int searchStudent(String target)通过名称查找并给出所需的索引。

    import java.util.ArrayList;

班级学生{

String name;
double gpa;

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

public String getName() {
    return name;
}

}

公共类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);
}

}

java search
1个回答
0
投票

索引0表示字符串前面的匹配项

[方法String::indexOf返回一个索引(从零开始的位置数字),指示找到所需目标字符串的第一个位置。

结果索引为零表示在检查的字符串的开头找到了您的目标。例如,您等效于在名称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

by中查找Bobby,得到的结果为3(第4个字母的索引)。

int index_by = name.indexOf( "by" ) ;
System.out.println( "index_by: " + index_by ) ;

index_by:3

参见此code run live at IdeOne.com

Count

如果您尝试成功计数任何“包含”测试,并且您并不真正在意where匹配的目标,而只是匹配did,那么就不需要完全拨打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() 
    ;

参见此code run live at IdeOne.com

countbobs:2

© www.soinside.com 2019 - 2024. All rights reserved.