簡體   English   中英

如何迭代對象的ArrayList並在迭代時訪問對象所屬的該類的方法?

[英]how to iterate an ArrayList of objects and to access a method of that class to which the object belongs while iterating?

我有一個Employee類,並且在該類中有一個名為getName()的方法,該方法返回雇員的姓名。 每個員工都有一些屬性(姓名,職位,職務,薪水),我將它們存儲在ArrayList中。

現在,我想編寫一個方法deleteEmployee(String, ArrayList<Employee>) ,該方法會將作為參數給出的字符串與員工姓名進行比較,如果找到匹配項,它將刪除該員工的全部詳細信息。嘗試了以下方法,但出現錯誤,我也不知道如何解決...

 public void deleteEmployee (String str,ArrayList <Employee> arr)
 {
    Employee obj2;

    for (int i = 0; i < arr.size(); i++)
    {
        if(str.equalsIgnoreCase(arr.get(obj2[i].getName())))
            arr.remove(obj2[i]);
        break;
    }
 }

您可能有一個ConcurrentModificationException或類似的東西。 那是因為除非使用Iterator,否則您無法修改要迭代的數組

你應該嘗試這樣的事情

Iterator<Employee> it = arr.iterator();
Employee currentEmployee = null;
while(it.hasNext()){
   currentEmployee = it.next();
   if(currentEmployee.getName().equals(obj2.getName()){
      it.remove();
   }
}

為了將來幫助解決您的問題,請同時發布您的錯誤和堆棧跟蹤。

如果只有一個與名稱相匹配的項目,則您的方法將起作用。 但是,您的錯誤在這里:

if(str.equalsIgnoreCase(arr.get(obj2[i].getName())))

相反,您需要從數組中獲取對象,然后對結果調用getName:

if(str.equalsIgnoreCase(arr.get(i).getName()))

您還需要在if塊中breakif(...) { arr.remove(i); break; } if(...) { arr.remove(i); break; }

當然,在您的實現中還有其他可以改進的地方。

據我所知,您的代碼存在一些問題。

首先,使用break並不是很好的做法。 特別是在使用過的地方使用它。 在您的代碼中, if語句處理完畢,則for循環結束。 無論if語句的結果如何, for循環都不會迭代。 因此,除非您只想檢查所需雇員是否在索引0處,否則這遠非理想。

for (int i = 0; i < arr.size(); i++)

這是第二個問題。 由於使用了break語句,因此在理想情況下它足夠好工作,但是如果所需的雇員不在ArrayList中,則將獲得IndexOutOfBoundsException因為在上一次迭代中,您將嘗試獲取該索引。 ArrayList的大小,該大小不存在。 相反,您的for循環應為

for (int i = 0; i < arr.size() - 1; i++)

這樣,如果沒有雇員,則循環將在到達ArrayList的最后一個索引(小於大小的1)時停止。

另一個更直接的問題是以下行:

if(str.equalsIgnoreCase(arr.get(obj2[i].getName())))

在此行中,當您應該使用ArrayList的索引時,您正在使用Employee對象作為參數調用arr.get

if(str.equalsIgnoreCase(arr.get(i).getName()))

通過此修改,您可以調用ArrayList的索引,該索引將返回Employee對象。 然后,您在該對象上調用getName() ,它返回字符串,就像您打算做的那樣,將字符串與str比較是否相等。

最后一個問題是刪除對象的行。

arr.remove(obj2[i]);

同樣,您似乎正在嘗試訪問Employee對象的索引,而不是ArrayList。 將此行更改為:

arr.remove(i);

會更加有效。 這樣,您將刪除數組的索引。 您可以使用對象作為remove()方法的參數,但是首先需要將i處的對象分配給obj2 ,這更加麻煩。 因此,將所有內容放在一起,新的固定循環將是

for (int i = 0; i < arr.size() - 1; i++){
   if(str.equalsIgnoreCase(arr.get(i).getName())){
      arr.remove(i);
   }
}

假設只有一個雇員使用給定的名稱,這不會有問題,但是要警告在遍歷列表時刪除ArrayLists中的對象存在問題。 例如,如果刪除i的對象,則ArrayList中位於其后的對象將全部向下移動一個索引。 然后,如果再次進行迭代,則將訪問列表中i+1處的對象。 但是,位於i+1的ACTUAL對象是最初位於i+2的對象。 因此,如果您在ArrayList中刪除一個對象,則將跳過在下一迭代中直接檢查緊隨其后的對象的檢查。 一種簡單的解決方案是遍歷ArrayList的BACKWARDS,以便從列表中刪除一個對象時,已經檢查了所有向下移動一個索引的對象。 還有其他更合適的解決方案,但是向后迭代是解決該問題的一種簡單方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM