Поиск Arraylist для имени и, если не найден, вернитесь, попробуйте еще раз - PullRequest
1 голос
/ 16 декабря 2010

Я сделал простую программу адресной книги, используя Arraylist (программа не сохраняет записи после завершения), и когда я ищу записи для записи, которая была не первой, в моих сообщениях об ошибках появляется информация о записи.Я понимаю, что это происходит из-за того, что использовалось условие if, а ошибка - в другом.Но я не знаю, как заставить программу работать по-другому.Я хочу иметь возможность искать записи по определенному имени (String), а затем отображать контактные данные этих лиц, а если это имя не было введено, отображать «Этот человек не указан, попробуйте другое».Я очень плохо знаком с программированием и обладаю очень ограниченными знаниями, и я знаю, что мой код выглядит плохо сейчас, но я хотел бы заставить его работать правильно, прежде чем он будет выглядеть хорошо.

                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 if ложно, и это то, что мне нужно исправить.

Ответы [ 4 ]

2 голосов
/ 16 декабря 2010

Вы допустили логическую ошибку в своем заявлении 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 голосов
/ 16 декабря 2010

Вы пробовали что-то вроде этого:

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 , поскольку он гораздо эффективнее, если вы просто хотите хранить и извлекать определенные строки.

Для краткого руководства, пожалуйста, следуйте этой ссылке.

1 голос
/ 16 декабря 2010

Прежде всего, я бы не стал использовать ArrayList - если вы собираетесь все время искать по имени, я бы сделал это картой с fullName в качестве ключа.

Во втором случае, почемуВы проверяете, имеет ли searchNAme значение "Q" в цикле адресной книги?Вы должны сделать это вместо цикла.

1 голос
/ 16 декабря 2010

Вот поток у вас сейчас:

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.

Длинное и короткое: вам нужно вывести часть кода из цикла. Я мог бы написать код для вас, но я уверен, что вы можете получить его. Я буду следить за этим, если у вас есть дополнительные вопросы, чтобы я мог помочь!

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