首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用startsWith()搜索数组

使用startsWith()搜索数组
EN

Stack Overflow用户
提问于 2015-10-13 15:21:42
回答 5查看 952关注 0票数 0

我正在寻找一些使用startsWith()在数组中进行搜索的帮助。

我希望用户输入名字,搜索数组,如果名字匹配,则打印: employee ID number,last name,first name。

如果没有匹配,则返回一条简单的错误消息。

下面的代码在数组中搜索,打印匹配的员工,但也会继续打印错误消息,直到它遍历整个数组。

当前输出:

代码语言:javascript
复制
ID No: 2345 - Holt, Steve
ID No: 2345 - Molt, Steve
ID No: 2345 - Sholt, Steve
ID No: 2345 - Colt, Steve
No Matching employee records found!
No Matching employee records found!
No Matching employee records found!
No Matching employee records found!
...

如何才能将其更改为只返回匹配,或者如果不匹配,则仅返回错误消息。

谢谢你的帮忙!

代码语言:javascript
复制
private static final Service [] employeeList = new Employee [10];
private static final Scanner scanner = new Scanner(System.in);

public static void main(String[] args){

                                    // First name / Last name / Employee Number

  final Employee FakeEmployee0 = new Employee("Steve", "Holt", "2345");
  final Employee FakeEmployee1 = new Employee("Steve", "Molt", "2111");
  final Employee FakeEmployee2 = new Employee("Steve", "Sholt", "245");
  final Employee FakeEmployee3 = new Employee("Steve", "Colt", "2222");
  final Employee FakeEmployee4 = new Employee("Steve", "Wolt", "25");
  final Employee FakeEmployee5 = new Employee("Boy", "Blue", "1");
  final Employee FakeEmployee6 = new Employee("Boy", "Wonder", "8999");
  final Employee FakeEmployee7 = new Employee("Boy", "George", "500");
  final Employee FakeEmployee8 = new Employee("Will", "Smith", "123");
  final Employee FakeEmployee9 = new Employee("Will", "Ferret", "23");      

  employeeList [0] = FakeEmployee0;
  employeeList [1] = FakeEmployee1;
  employeeList [2] = FakeEmployee2;
  employeeList [3] = FakeEmployee3;
  employeeList [4] = FakeEmployee4;
  employeeList [5] = FakeEmployee5;
  employeeList [6] = FakeEmployee6;
  employeeList [7] = FakeEmployee7;
  employeeList [8] = FakeEmployee8;
  employeeList [9] = FakeEmployee9;

// Search for employees by first name:

  private static void searchNames(){

    System.out.println("Enter employee's first name: ");
    String nameCheck = sc.nextLine();


    for (int i = 0; i < employeeList.length; i++){
        if (employeeList[i].getFirstName().startsWith(nameCheck)){
            System.out.println("ID No: " + employeeList[i].getIdNum() + " - "
                               + employeeList[i].getLastName() + " " +
                               employeeList[i].getFirstName());
        }

        else {
            System.out.println("No Matching employee records found!");
        }
}
}
EN

回答 5

Stack Overflow用户

发布于 2015-10-13 15:24:01

问题出在您的for循环中。实际上,您打印的是不符合您描述的每个员工的错误消息。

要解决这个问题,您可以简单地设置一个布尔标志,call is empFound,它最初设置为false。在遍历员工时,如果发现匹配,则只需将empFound设置为true并break循环即可。

for循环之外,当且仅当empFoundfalse时,才会显示错误消息。

正如@vvs指出的,一旦你找到了匹配的对象,这里提出的解决方案就会停止,也就是说,它最多会产生1次命中。如果想要列出所有以字符串开头的雇员,只需省略break语句。这将导致循环继续运行,并检查所有的employee元素。

票数 5
EN

Stack Overflow用户

发布于 2015-10-13 15:26:53

我想他是想把所有的工作都打印出来,这样断了也解决不了问题。您应该做的是,如果您找到至少一个具有给定姓名的员工,则设置一个标记。

代码语言:javascript
复制
boolean atLeastOneFound = false;
for (int i = 0; i < employeeList.length; i++){
    if (employeeList[i].getFirstName().startsWith(nameCheck)){
        System.out.println(...);
        atLeastOneFound = true;
    }
}
if (!atLeastOneFound) {
    System.out.println("No Matching employee records found!");
}
票数 0
EN

Stack Overflow用户

发布于 2015-10-13 15:47:53

您可以使用Java 8 streams轻松完成此操作:

代码语言:javascript
复制
public static void main(final String[] args) throws Exception {
    Scanner scanner = new Scanner(System.in);
    Employee[] employees = {
            new Employee("Steve", "Holt", "2345"),
            new Employee("Steve", "Molt", "2111"),
            new Employee("Steve", "Sholt", "245"),
            new Employee("Steve", "Colt", "2222"),
            new Employee("Steve", "Wolt", "25"),
            new Employee("Boy", "Blue", "1"),
            new Employee("Boy", "Wonder", "8999"),
            new Employee("Boy", "George", "500"),
            new Employee("Will", "Smith", "123"),
            new Employee("Will", "Ferret", "23")
    };
    String prefix = scanner.nextLine();
    List<Employee> matches =
            Arrays.stream(employees).filter(e -> e.getFirstName().startsWith(prefix)).collect(Collectors.toList());

    if (matches.isEmpty()) {
        System.out.println("No Matching employee records found!");
    } else {
        matches.stream().forEach(System.out::println);
    }

    scanner.close();
}

如果不能使用streams,则必须遍历数组并自行构建matches列表。

我移动了

代码语言:javascript
复制
System.out.println("ID No: " + employeeList[i].getIdNum() + " - "
                           + employeeList[i].getLastName() + " " +
                           employeeList[i].getFirstName());

加入Employee类的toString方法,如下所示:

代码语言:javascript
复制
public String toString() {
    return String.format("ID No: %s - %s %s", id, lastName, firstName);
}

因此,我们可以只编写matches.stream().forEach(System.out::println);来打印所有匹配的员工。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33096486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档