Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用startsWith()搜索数组_Java_Arrays - Fatal编程技术网

Java 使用startsWith()搜索数组

Java 使用startsWith()搜索数组,java,arrays,Java,Arrays,我正在寻找使用startsWith()在数组中搜索的帮助 我希望用户输入名字,搜索数组,如果名字匹配,则打印:员工ID号、姓氏、名字 如果没有匹配项,则返回一条简单的错误消息 下面的代码在数组中搜索,打印匹配的员工,但也会继续打印错误消息,直到它在整个数组中循环 当前的输出: ID No: 2345 - Holt, Steve ID No: 2345 - Molt, Steve ID No: 2345 - Sholt, Steve ID No: 2345 - Colt, Steve No Mat

我正在寻找使用startsWith()在数组中搜索的帮助

我希望用户输入名字,搜索数组,如果名字匹配,则打印:员工ID号、姓氏、名字

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

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

当前的输出:

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!
...
如何将其更改为仅返回匹配项,或者如果不匹配,则仅返回错误消息

谢谢你的帮助

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!");
        }
}
}
private static final Service[]employeeList=新员工[10];
专用静态最终扫描仪=新扫描仪(System.in);
公共静态void main(字符串[]args){
//名/姓/员工编号
最终员工FakeEmployee0=新员工(“史蒂夫”、“霍尔特”、“2345”);
最终员工FakeEmployee1=新员工(“Steve”、“Molt”、“2111”);
最终员工FakeEmployee2=新员工(“Steve”、“Sholt”、“245”);
最终员工FakeEmployee3=新员工(“史蒂夫”、“柯尔特”、“2222”);
最终员工FakeEmployee4=新员工(“Steve”、“Wolt”、“25”);
最终员工FakeEmployee5=新员工(“男孩”、“蓝色”、“1”);
最终员工FakeEmployee6=新员工(“男孩”、“奇迹”、“8999”);
最终员工FakeEmployee7=新员工(“男孩”、“乔治”、“500”);
最终员工FakeEmployee8=新员工(“威尔”、“史密斯”、“123”);
最终员工FakeEmployee9=新员工(“Will”、“Ferret”、“23”);
员工列表[0]=FakeEmployee0;
员工列表[1]=FakeEmployee1;
员工列表[2]=FakeEmployee2;
员工列表[3]=FakeEmployee3;
员工列表[4]=FakeEmployee4;
员工列表[5]=FakeEmployee5;
员工列表[6]=FakeEmployee6;
员工列表[7]=FakeEmployee7;
员工列表[8]=FakeEmployee8;
员工列表[9]=FakeEmployee9;
//按姓名搜索员工:
私有静态void searchNames(){
System.out.println(“输入员工的名字:”);
字符串名称检查=sc.nextLine();
for(int i=0;i
声明一个标志
isFound=false;

添加一个中断:

if (employeeList[i].getFirstName().startsWith(nameCheck)){
                System.out.println("ID No: " + employeeList[i].getIdNum() + " - "
                                   + employeeList[i].getLastName() + " " +
                                   employeeList[i].getFirstName());
                 isFound = true;
                 break;
            }
并从循环中删除错误消息。 循环外检查:

if(isFound) {
// print message
}
问题出在您的
for
循环中。您实际上是在为每个员工打印不符合您描述的错误消息

为了解决这个问题,您可以简单地使用一个布尔标志,call is
empFound
,该标志最初设置为
false
。在检查员工时,如果找到匹配项,则只需将
empFound
设置为true并
break
循环

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


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

Ins在if块内执行ert
break
语句,直到循环结束

if (employeeList[i].getFirstName().startsWith(nameCheck)){
            System.out.println("ID No: " + employeeList[i].getIdNum() + " - "
                               + employeeList[i].getLastName() + " " +
                               employeeList[i].getFirstName());
          break;
}

我想他想把所有匹配的员工都打印出来,所以break无法解决这个问题。 如果您发现至少有一名员工的名字,您应该做的是设置一个标志

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!");
}
boolean-atLeastOneFound=false;
for(int i=0;i
您可以使用Java 8流轻松完成此操作:

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();
}
按如下方式进入
Employee
类的
toString
方法:

public String toString() {
    return String.format("ID No: %s - %s %s", id, lastName, firstName);
}

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

使用语句停止循环,并将其他部分放在循环之外。您可以添加您得到的输出吗?插入break将导致代码只打印“first”匹配。这将在每次迭代中输出
未找到匹配的员工记录!
,直到找到(或未找到)某个值为止。中断循环不是必需的,因为它会导致循环在一次匹配后中断。@vvs:
如果名字匹配
,这就是为什么我认为需要使用
break
语句的原因。我将对我的回答进行澄清。我同意问题中不清楚是否需要1次匹配或更多。我同意编辑made.我宁愿使用布尔标志作为循环的附加条件,而不是使用
break
。如果循环中的逻辑变得更复杂,那么
break
语句可能会给程序员造成一些混乱的结果。@KevinEsche:那也行。我选择
break
仅仅是因为这看起来很简单这将是一项作业,因此我借此机会尝试将OP介绍给另一个关键字。@X.L.Ant感谢您指出错误。编辑了AnserTanks以获得详细的答复!不幸的是,活动的限制不允许我使用此选项,但它对未来非常有用!太棒了!感谢您的帮助!如果没有匹配,循环仍然打印出10行“没有匹配的员工…”我怎么能对付这个?你呢
public String toString() {
    return String.format("ID No: %s - %s %s", id, lastName, firstName);
}