2017-06-24 47 views
-2

有問題顯示我在數組列表中搜索的內容。當我搜索數組時,它會查找信息,但它會將所有列表中的所有對象都命名爲fisherman。它將搜索該項目,如果找到將打印我想要的項目,但它會打印所有漁夫的實例。但是搜索很笨重,並且在某些情況下不起作用。所以,我需要搜索功能的幫助才能對搜索進行正確的搜索和輸出。我不知道如何將對象名稱從「漁夫」改爲每個漁夫的SSN,然後這將有助於搜索參數。但我無法想出一種方法來改變每個漁民的對象名稱。感謝您提供任何幫助。函數數組列表搜索

public static void fishermanMenu() { 
    // declare variables and array 
    int selection; 
    String fName; 
    String lName; 
    String ssn; 
    String number; 
    String email; 
    String searchSSN; 
    String menuFisherman[] = {"Register New Fisherman", "Search Fisherman", "Return to Main Menu"}; 

    System.out.println("\nFisherman Menu"); 
    // for loop to print menu from array 
    for(int i = 0, k = 1; i < menuFisherman.length; i++, k++) { 
     System.out.println("("+ k + ") " + (menuFisherman[i]));  
    } 
    System.out.print("Selection: "); 
    selection = input.nextInt(); 
    input.nextLine(); 
    if (selection == 1) {  
     $Fisherman fisherman = new $Fisherman(); 
     fishermen.add(fisherman); 

     System.out.print("Enter First Name: "); 
     fName = input.next(); 
     fisherman.setFirstName(fName); 

     System.out.print("Enter Last Name: "); 
     lName = input.next(); 
     fisherman.setLastName(lName); 

     System.out.print("Enter Phone Number...ie 904-560-7896: "); 
     number = input.next(); 
     fisherman.setPhoneNumber(number); 

     System.out.print("Enter SSN...ie 123-45-6789: "); 
     ssn = input.next(); 
     fisherman.setSSN(ssn); 

     System.out.print("Enter email address: "); 
     email = input.next(); 
     fisherman.setEmailAddress(email); 

     System.out.print(fishermen.toString()); 

     fishermanMenu(); 
    } 

    else if (selection == 2) { 
     System.out.println("Enter Social Security Number of fisherman to search for below."); 
     System.out.print("SSN: "); 
     searchSSN = input.nextLine(); 

     for ($Fisherman fisherman : fishermen) { 
      if (fisherman.getSSN().equals(searchSSN)) { 
       System.out.println(fishermen.toString()); 
       fishermanMenu(); 
      } 
      else { 
       System.out.println("No match for that fisherman"); 
       fishermanMenu(); 
      }    
     } 
    } 
} 

這裏是輸出。正如你所看到的,當我搜索「123」時,它返回了整個列表,當我搜索「456」時,它說「沒有匹配那個漁夫」。

Main Menu 
    (1) Fisherman Menu 
    (2) Tournament Menu 
    (3) Fish Menu 
    (4) Close Tournament 
    (5) Quit Program 
    Selection: 1 

    Fisherman Menu 
    (1) Register New Fisherman 
    (2) Search Fisherman 
    (3) Return to Main Menu 
    Selection: 1 
    Enter First Name: Matt 
    Enter Last Name: P 
    Enter Phone Number...ie 904-560-7896: 123 
    Enter SSN...ie 123-45-6789: 123 
    Enter email address: 123 

    [fisherman{SSN=123, firstName='Matt', lastName='P', phoneNumber='123', emailAddress='123'}] 

    Fisherman Menu 
    (1) Register New Fisherman 
    (2) Search Fisherman 
    (3) Return to Main Menu 
    Selection: 1 
    Enter First Name: Joe 
    Enter Last Name: K 
    Enter Phone Number...ie 904-560-7896: 456 
    Enter SSN...ie 123-45-6789: 456 
    Enter email address: 456 

    [fisherman{SSN=123, firstName='Matt', lastName='P', phoneNumber='123', emailAddress='123'}, fisherman{SSN=456, firstName='Joe', lastName='K', phoneNumber='456', emailAddress='456'}] 

    Fisherman Menu 
    (1) Register New Fisherman 
    (2) Search Fisherman 
    (3) Return to Main Menu 
    Selection: 2 
    Enter Social Security Number of fisherman to search for below. 
    SSN: 123 
    [fisherman{SSN=123, firstName='Matt', lastName='P', phoneNumber='123', emailAddress='123'}, fisherman{SSN=456, firstName='Joe', lastName='K', phoneNumber='456', emailAddress='456'}] 

    Fisherman Menu 
    (1) Register New Fisherman 
    (2) Search Fisherman 
    (3) Return to Main Menu 
    Selection: 2 
    Enter Social Security Number of fisherman to search for below. 
    SSN: 456 
    No match for that fisherman 

    Fisherman Menu 
    (1) Register New Fisherman 
    (2) Search Fisherman 
    (3) Return to Main Menu 
    Selection: 
+0

小建議在這裏:Java約定不鼓勵在標識符中使用「$」,除了遺留或機器生成的代碼。閱讀Java語言規範[這裏](https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.8) –

回答

0

這是因爲您正在打印fishermen.toString()這是整個列表。

System.out.println(fishermen.toString()); 

更改上述打印fisherman.toString()代替

編輯:

您正在使用if-else在循環中的每一個漁民,你需要修復,如下所示:

int found = 0; 
for ($Fisherman fisherman : fishermen) { 
    if (fisherman.getSSN().equals(searchSSN)) { 
     found = 1; 
     System.out.println(fisherman); 
     break; 
    } 
if (found == 0) { 
    System.out.println("No match for that fisherman"); 
    fishermanMenu();    
} 
else { 
    found = 0; 
    fishermanMenu(); 
} 
+0

我改變了'((漁民。 toString())'只是'(漁夫)',現在它只打印正在輸入或搜索的內容,正如我想要的那樣。但是,我仍然沒有得到「456」搜索的回報,並直接跑到「不匹配那個漁夫」,但在搜索「123」時效果很好。 –

+0

@MatthewPhaneuf這是因爲你爲每個漁夫使用了'if-else',我已經更新了我的答案以解決這個問題,請檢查一下,並讓我知道 –

0
public class Main { 

    private static List<Fisherman> allFisherpeople = new ArrayList<Fisherman>(); 

    public static void main(String... args) { 
     while (true) { 
      printMenu(); 

      String selection = getInput(); 
      if ("1".equals(selection)) { 
       addFisherman(); 
      } else if ("2".equals(selection)) { 
       searchFishermen(); 
      } else { 
       System.out.println("Not a vaild selection: " + selection); 
      } 
     } 
    } 

    private static String getInput() { 
     try { 
      String string = new String(); 
      char character; 
      while ((character = (char) System.in.read()) != '\n') 
       string += character; 
      return string; 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private static void printMenu() { 
     String menuFisherman[] = { "Register New Fisherman", "Search Fisherman", "Return to Main Menu" }; 
     System.out.println("\nFisherman Menu"); 
     for (int i = 0; i < menuFisherman.length; i++) { 
      System.out.println("(" + (i + 1) + ") " + (menuFisherman[i])); 
     } 
     System.out.print("Selection: "); 
    } 

    private static void addFisherman() { 
     Fisherman fisherman = new Fisherman(); 
     System.out.print("Enter First Name: "); 
     fisherman.setFirstName(getInput()); 
     System.out.print("Enter Last Name: "); 
     fisherman.setLastName(getInput()); 
     System.out.print("Enter Phone Number...ie 904-560-7896: "); 
     fisherman.setPhoneNumber(getInput()); 
     System.out.print("Enter SSN...ie 123-45-6789: "); 
     fisherman.setSsn(getInput()); 
     System.out.print("Enter email address: "); 
     fisherman.setEmail(getInput()); 
     System.out.print(fisherman); 
     allFisherpeople.add(fisherman); 
    } 

    private static void searchFishermen() { 
     System.out.println("Enter Social Security Number of fisherman to search for below."); 
     System.out.print("SSN: "); 
     String search = getInput(); 

     for (Fisherman fisherman : allFisherpeople) { 
      if (fisherman.getSsn().equals(search)) { 
       System.out.println("You must be looking for: " + fisherman); 
      } else { 
       System.out.println("No match for that fisherman"); 
      } 
     } 
    } 

    private static class Fisherman { 
     private String firstName; 
     private String lastName; 
     private String ssn; 
     private String phoneNumber; 
     private String email; 

     public String getFirstName() { 
      return firstName; 
     } 

     public void setFirstName(String firstName) { 
      this.firstName = firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

     public void setLastName(String lastName) { 
      this.lastName = lastName; 
     } 

     public String getSsn() { 
      return ssn; 
     } 

     public void setSsn(String ssn) { 
      this.ssn = ssn; 
     } 

     public String getPhoneNumber() { 
      return phoneNumber; 
     } 

     public void setPhoneNumber(String phoneNumber) { 
      this.phoneNumber = phoneNumber; 
     } 

     public String getEmail() { 
      return email; 
     } 

     public void setEmail(String email) { 
      this.email = email; 
     } 

     public String toString() { 
      return firstName + " " + lastName + " (" + phoneNumber + ")"; 
     } 
    } 
} 
+0

你編寫代碼的方式會遞歸到你的方法中。 System.out.println(obj)已經對它做了一個toString,所以不需要編寫System.out.println(obj.toString())。我從來沒有使用std,所以拿一點鹽就可以了。 – Tim

0

謝謝你的幫助。幾個小時後,一個新的眼睛和你的評論我能看到的問題。我將第44行和第56行的代碼從(fishermen.toString())更改爲(fisherman),並解決了每次打印所有漁夫的問題。還將該else語句更改爲for循環外部的單個打印語句。這允許搜索在打印「不匹配那個漁夫」之前通過整個列表而不僅僅是第一個漁夫。

else if (selection == 2) { 
     System.out.println("Enter Social Security Number of fisherman to search for below."); 
     System.out.print("SSN: "); 
     searchSSN = input.nextLine(); 

     for ($Fisherman fisherman : fishermen) { 
      if (fisherman.getSSN().equals(searchSSN)) { 
       System.out.println(fisherman); 
       fishermanMenu(); 
      } 
     } 
     System.out.println("No match for that fisherman"); 
     fishermanMenu(); 
    }