搜索Arraylist的名称,如果没有找到返回再试一次

时间:2010-12-16 19:25:46

标签: java search arraylist

我使用Arraylist创建了一个简单的地址簿程序(程序在终止后不保存条目),当我在条目中搜索不是第一个的条目时,我的错误消息会出现条目信息。我知道这是因为使用了if条件而错误是其他的。但我不知道如何使程序以另一种方式工作。我希望能够在条目中搜索特定名称(字符串),然后显示该人员联系信息,如果未输入该名称,则显示“该人未列出,请尝试另一个人”。我对编程非常陌生并且知识非常有限,而且我知道我的代码现在看起来很糟糕,但我希望在使它看起来很好之前让它正常工作。

                while(!search){
                    if(listSize == 0){
                        break;//does not allow search if no names have been entered.
                    }

                    System.out.print("Please enter the first name to search for or q to quit: ");
                    String searchName = in.next().trim().toUpperCase();

                    for(AddressBook a: myBook){
                    if(searchName.compareTo("Q") == 0){
                        search = true;//allows user to exit search
                    }

                    else if(a.getName().compareTo(searchName) == 0){
                        System.out.println("that contact info is: ");
                        System.out.println("name: " + a.getFullName());
                        System.out.println("phone number: " + a.getPhoneNumber());
                        System.out.println("email: " + a.getEmail());
                        System.out.println("address: " + a.getAddress());
                        search = true;
                        break;
                    }

                    else
                        System.out.println("That name is not listed please try another");
                    }
                }

这是我的代码的搜索部分,我遇到的问题是最后一个if / else。我知道当我搜索一个名字并且它没有出现在第一个元素中时,程序会转到else,因为else if条件为false,这就是我需要解决的问题。

4 个答案:

答案 0 :(得分:2)

你有没有试过这样的事情:

System.out.print("Please enter the first name to search for or q to quit: ");
String searchName = in.next().trim().toUpperCase();
if (searchName.equals("Q") == false)
{
    boolean found = false;
    for(AddressBook a: myBook){ 
       if(a.getName().toUpperCase().equals(searchName)){
           System.out.println("that contact info is: ");
           System.out.println("name: " + a.getFullName());
           System.out.println("phone number: " + a.getPhoneNumber());
           System.out.println("email: " + a.getEmail());
           System.out.println("address: " + a.getAddress());
           found = true;
           break;
           }

    if(found == false)
    { 
       System.out.println("Item Not Found!");
    }
}

P.S。我认为您应该使用HashMap,因为如果您只想存储和检索特定字符串,它会更有效率。

如需简短教程,请点击this链接。

答案 1 :(得分:2)

您在for语句中出现了逻辑错误。 首先,您应该检查仅输入一次“Q”字母(不在for声明中)。 那么你应该检查for的每次迭代是否存在其中一个名称,然后(如果 myBook 集合的所有项目都没有出现你的搜索条件(等于 searchName ),您应该显示错误消息。因此,改进的代码版本如下所示:

while(!search){
   if(listSize == 0){
      break;//does not allow search if no names have been entered.
   }

   System.out.print("Please enter the first name to search for or q to quit: ");
   String searchName = in.next().trim().toUpperCase();

   if(searchName.compareTo("Q") == 0){
         search = true;//allows user to exit search
         break; //exit "while" iteration
   }

   boolean found = false;

   for(AddressBook a: myBook){
       if(a.getName().compareTo(searchName) == 0){
           System.out.println("that contact info is: ");
           System.out.println("name: " + a.getFullName());
           System.out.println("phone number: " + a.getPhoneNumber());
           System.out.println("email: " + a.getEmail());
           System.out.println("address: " + a.getAddress());
           search = true;
           found = true;
       }              
   }
   if(found == false)
       System.out.println("That name is not listed please try another");       
}

答案 2 :(得分:1)

以下是您现在的流程:

1. Read in the requested name to search for
2. Get the first element in the list. Put it in a.  
   a. Did the user enter Q? Then eventually exit the loop. 
   b. Does the first element match? If so, print info. 
   c. Otherwise, print The name is not listed. Try again...

你想要的是

1. Read request
2. If request is Q, quit. 
3. If request is not Q then loop through the list
   a. If an element matches, set flag saying we found a match.
4. After the loop, check the flag to see if a match was found. If it was, print the info
5. If a match wasn't found, print Try again.

长和短,你需要将一些代码移出循环。我可以为你编写代码,但我相信你可以得到它。如果你有更多问题,我会监控这个,所以我可以提供帮助!

答案 3 :(得分:1)

首先,我不会使用ArrayList - 如果你要一直按名字搜索,我会把它作为一个以fullName为键的Map。

在第二种情况下,为什么要在Addressbook循环中检查searchNAme是否为“Q”?你应该这样做而不是循环。