2016-02-05 41 views
0

我想創建一個程序,允許用戶使用指定的工資號刪除員工。訪問和修改數組列表的問題

該程序應具有如下功能:

程序顯示在ArrayList中目前的工作人員詢問用戶他們想要刪除工資號的輸入之前。然後用戶輸入三名工作人員中的一名工作人員的工資號並按下回車鍵。按下回車後,程序應該從陣列列表中刪除特定的工作人員並再次顯示整個列表(錯過顯然已經刪除的工作人員)。如果他們不希望刪除任何工資單號碼,工資單號碼應爲0,然後應再次顯示該清單的內容。

我有以下的文件和結構:

---編輯---:ArrayListTest.java

import java.util.*; 

import personnelPackage.Personnel; 

public class ArrayListTest 
{ 
    static Scanner keyboard = new Scanner(System.in); 

    public static void main(String[] args) 
    { 
     long searchQuery; 

     ArrayList<Personnel> staffList = new ArrayList<Personnel>(); 
     Personnel[] staff = 
      {new Personnel(123456,"Smith","John"), 
      new Personnel(234567,"Jones","Sally Ann"), 
      new Personnel(999999,"Black","James Paul")}; 

     for (Personnel person:staff) 
      staffList.add(person); 

     do 
     { 
      showDisplay(staffList); 

      System.out.print("\nPlease enter a payroll number to search: "); 
      searchQuery = keyboard.nextLong(); 

      searchForPayrollNumber(staffList, searchQuery); 


     }while(!(searchQuery == 0)); 


    } 

    private static void showDisplay(ArrayList<Personnel> staffList) 
    { 
     System.out.print("\n------------- CURRENT STAFF LIST -------------\n"); 
     for (Personnel person : staffList) 
     { 
      System.out.println("Payroll number: " + person.getPayNum()); 
      System.out.println("Surname: " + person.getSurname()); 
      System.out.println("First name(s): " + person.getFirstNames() + "\n"); 
     } 
    } 

    public static void searchForPayrollNumber(ArrayList<Personnel> staffList, long searchQuery) 
    { 
     long index = staffList.indexOf(searchQuery);; 

     for (Personnel person: staffList) 
     { 
      if (person.getPayNum() == searchQuery) 
      {    
       System.out.print("\n------------- Staff member found and removed! -------------"); 
       System.out.println("\n\nFirst Name(s): " + person.getFirstNames()); 
       System.out.println("\nSurname: " + person.getSurname()); 
       System.out.print("\n-----------------------------------------------"); 

       staffList.remove(index); 
       return; 
      } 
     } 

     System.out.print("\n------------- No staff members found. Program terminated -------------"); 
     return; 

    } 

} 

Personnel.java(在其自己的包命名爲personnelPackage

package personnelPackage; 

public class Personnel 
{ 
    private long payrollNum; 
    private String surname; 
    private String firstNames; 

    public Personnel(long payrollNum, String surname, String firstNames) 
    { 
     this.payrollNum = payrollNum; 
     this.surname = surname; 
     this.firstNames = firstNames; 
    } 

    public long getPayNum() 
    { 
     return payrollNum; 
    } 

    public String getSurname() 
    { 
     return surname; 
    } 

    public String getFirstNames() 
    { 
     return firstNames; 
    } 

    public void setSurname(String newName) 
    { 
     surname = newName; 
    } 
} 

我的程序在分鐘只識別第一個員工memb呃,如果我輸入工資號碼。任何其他工作人員不會被「發現」。我在哪裏錯了?如何從數組中刪除特定的工資覈算編號並要求用戶輸入另一個(直到數組爲「空」)。

+0

showDisplay的輸出? –

回答

3

刪除else塊中的return聲明。

for (Personnel person: staff) 
    { 
     if (person.getPayNum() == searchQuery) 
     { 
      System.out.print("\n------------- Staff member found! -------------"); 
      System.out.println("\n\nFirst Name(s): " + person.getFirstNames()); 
      System.out.println("Surname: " + person.getSurname()); 
      return; 
     } 
     else 
     { 
      System.out.print("\n------------- No staff members found -------------"); 
      return; // Remove this one. 
     } 
    } 

通過在條件的每個分支中有一個return語句,該循環將只執行一次。

請注意,您可能還希望將else的內容移到循環外部,否則會爲每個檢查人員告知「沒有工作人員發現」。

for (Personnel person: staff) 
    { 
     if (person.getPayNum() == searchQuery) 
     { 
      System.out.print("\n------------- Staff member found! -------------"); 
      System.out.println("\n\nFirst Name(s): " + person.getFirstNames()); 
      System.out.println("Surname: " + person.getSurname()); 
      return; 
     } 
    } 
    System.out.print("\n------------- No staff members found -------------"); 

編輯爲您有關刪除元素問題:

您當前的代碼將無法正常工作:indexOf將返回-1,因爲該列表包含Personnel實例,而不是就業數據。如果這確實起作用,那麼就不需要迭代列表來再次查找元素:您已經知道它在列表中的位置。

要進行高效的移除,您需要使用Iterator;增強的for循環將不起作用。粗糙的實現是這樣的:

Iterator<Personnel> it = staff.iterator(); 
while (it.hasNext()) { 
    Personnel person = it.next(); 
    if (person.getPayNum() == searchQuery) 

{ // ...打印等 it.remove(); return; } }

+0

感謝這個夢幻般的答案!我如何做到這一點,以便從列表中刪除找到的工作人員? (在'searchForPayrollNumber')我將不得不傳入'ArrayList'而不是'staff'數組?你能告訴我如何做到這一點嗎? – Olehi

+0

已編輯,但請不要在將來針對您的問題挑戰車手:改爲提出新問題。 –

+0

明白了。謝謝! – Olehi

1

您必須從搜索中移除return;聲明。這指示jvm從方法返回。

if (person.getPayNum() == searchQuery) 
      { 
       System.out.print("\n------------- Staff member found! -------------"); 
       System.out.println("\n\nFirst Name(s): " + person.getFirstNames()); 
       System.out.println("Surname: " + person.getSurname()); 
       // return; // This return is optional, won't interfere with your business. 
      } 
      else 
      { 
       System.out.print("\n------------- No staff members found -------------"); 
       // return; // This one has to be removed for proper function. 
      } 
+0

感謝您的回覆!我能否從名單中刪除找到的「人物」? (請參閱我在'ArrayListTest'的主要問題中編輯的代碼) – Olehi

1

問題是你的if/else中的「return」。當你返回else時,主要方法停止。所以如果被搜索的人不是第一個,那麼方法結束。只需刪除else子句並將打印輸出到for循環之外即可。

for (Personnel person: staff) 
    { 

     if (person.getPayNum() == searchQuery) 
     { 
      System.out.print("\n------------- Staff member found! -------------"); 
      System.out.println("\n\nFirst Name(s): " + person.getFirstNames()); 
      System.out.println("Surname: " + person.getSurname()); 
      return; 
     } 



    } 
    System.out.print("\n------------- No staff members found ------- 
+0

感謝您的回覆!我能否從名單中刪除找到的「人物」? (請參閱我在'ArrayListTest'的主要問題中編輯的代碼) – Olehi

+0

不要編輯你的問題到一個完整的新問題。問一個新問題。 – Marcinek

0

在您的上述代碼中您return在else塊中。從else塊中刪除return語句,以便循環執行。這裏循環不是因爲在塊中行爲而是返回語句。

public static int searchForPayrollNumber(Personnel[] staff) 
    { 
int i=0; 
     long searchQuery; 

     System.out.print("\nPlease enter a payroll number to search: "); 
     searchQuery = keyboard.nextLong(); 

     for (Personnel person: staff) 
     { 

      if (person.getPayNum() == searchQuery) 
      { 
       System.out.print("\n------------- Staff member found! -------------"); 
       System.out.println("\n\nFirst Name(s): " + person.getFirstNames()); 
       System.out.println("Surname: " + person.getSurname()); 
       i++;  
       break; 
      } 

     } 
return i; 

    } 

在上面的函數中檢查方法的返回值。如果它是0,那麼找不到記錄。